从MVC路由器中的虚拟路径检索路由数据

时间:2018-08-12 01:48:31

标签: c# asp.net-core asp.net-core-mvc asp.net-mvc-routing

我正在开发.NET Core MVC应用程序,该应用程序要求允许使用备用控制器/动作名称。为此,我在MapRoute上使用了自己的路由器:

app.UseMvc(routes =>
        {
            routes.Routes.Add(new CustomRouter(routes.DefaultHandler));
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });

我的自定义路由器观察到所请求的控制器和操作,并基于此将新值放入请求中的RouteData中:

public async Task RouteAsync(RouteContext context)
{
   [...]
   if (requestedAction == "fakeAction")
    context.RouteData.Values["action"] = "realAction";

但是,要确定requestedAction的值,我基本上是采用请求的路径,将其拆分并以这种方式获取其值。这似乎不是最佳选择。

我想做的事情看起来像这样:

var rr = new RouteBuilder(app);
var myRoute = rr.MapRoute(...).Build();
var myRouteData = myRoute.GetRouteData(context);
myRouteData["action"] == "fakeAction";

对此问题,我非常喜欢的另一种解决方法是,我可以执行以下操作:

   app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "something",
                template: "{controller=Home}/{action=Index}/{id?}");
            routes.Routes.Add(new CustomRouter(routes.DefaultHandler));
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });

但是我的something路由实际上并未路由任何内容,仅用作为CustomRouter定义RouteData的一种方式。

这两种可能吗?我不喜欢我们不干净地实现现有功能的想法,因为它既有代码味道,又有潜在的维护难度。

1 个答案:

答案 0 :(得分:0)

希望对您有所帮助

import java.util.Scanner;

public class RemoveDuplicateLetters {

public static void main(String[] args) {

    Scanner scn=new Scanner(System.in);
    System.out.println("enter a String:");
    String s=scn.nextLine();
    String ans="";

           while(s.length()>0)
        {
           char ch = s.charAt(0);
            ans+= ch;
            s = s.replace(ch+"",""); //Replacing all occurrence of the current character by a spaces
        }
    System.out.println("after removing all duplicate letters:"+ans);
    }
  }