Asp.net mvc 如何通过mvc中的路由匹配到正确的操作方法?

Asp.net mvc 如何通过mvc中的路由匹配到正确的操作方法?,asp.net-mvc,asp.net-mvc-4,routing,routes,asp.net-mvc-routing,Asp.net Mvc,Asp.net Mvc 4,Routing,Routes,Asp.net Mvc Routing,我太困惑了,以至于我没能正确地回答这个问题。 这是我的问题。以下是我申请中的路线 //"list/author" => list by author routes.MapRoute("ListByAuthor", "list/{author}", new { controller = "MyCtrl", action = "MyAction" }); //"list/tag" => list by tag routes.MapRoute("ListBy

我太困惑了,以至于我没能正确地回答这个问题。 这是我的问题。以下是我申请中的路线

//"list/author" => list by author
routes.MapRoute("ListByAuthor",
       "list/{author}",
        new { controller = "MyCtrl", action = "MyAction" });

//"list/tag" => list by tag
routes.MapRoute("ListBytag",
       "list/{tag}",
        new { controller = "MyCtrl", action = "MyACtion" });

//default
routes.MapRoute("Default",
       "{controller}/{action}/{id}",
        new { controller = "MyCtrl", action = "MyAction", id = UrlParameter.Optional });
我通过提供RouteName来生成视图上的链接,即ListByAuthorListByTagDefault。我有两个问题:-

  • 未将入站url与相应的操作方法进行匹配。 每个请求都由第一个路由处理
    ListByAuthor
    例如,当我单击标记时,地址栏显示正确的url格式,即
    域/列表/标记
    ,但通过调试,我发现
    标记
    值已分配给
    作者
    参数。
  • 单击其他链接时,环境值与url保持挂起。因此,其他环节刹车下来,开始咬我。例如,当我单击作者链接时,标记链接变成
    domain/list/tag?author
    。网站上的一个解决方案建议在路由值中传递
    String.Empty
    ,但它不起作用。但是如果我改变路线如下

    //"list/author" => list by author
    routes.MapRoute("ListByAuthor",
       "list/{author}",
        new { controller = "MyCtrl", action = "MyAction", tag = "" }); //providing empty value to tag parameter in route
    

  • 但是,在路由中显式提供默认值需要大量工作。请给我一些答案。我正在与路线作斗争。支持我赢得这场战争。提前谢谢

    我不是专家,但我认为原因是因为你的路线是一样的, 范例

    yourdomain.com/list/authorxm将匹配第一个路由

    yourdomain.com/list/tagx也将匹配

    因为{author}和{tag}只是参数

    试试这个:

        //"list/author" => list by author
       routes.MapRoute("ListByAuthor",
       "list/ByAuthor/{author}",
        new { controller = "MyCtrl", action = "MyActionByAuthor" });
    
        //"list/tag" => list by tag
         routes.MapRoute("ListBytag",
       "list/ByTag/{tag}",
        new { controller = "MyCtrl", action = "MyACtionByTag" });
    
        //default
         routes.MapRoute("Default",
       "{controller}/{action}/{id}",
        new { controller = "MyCtrl", action = "MyAction", id = UrlParameter.Optional })