asp.net MVC路由配置

时间:2017-02-22 16:55:13

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

我有一个带有路由配置规则的ASP.Net MVC应用程序,包括这个:

routes.MapRoute(
        "rule1",
    "{controller}/{action}/{cid}/{language}/{itemID}/{uid}",
    new { controller = "Home", action = "action1" }
    , new[] { "MVCApp.Controllers" }
);

我刚添加了具有相同参数数量的新操作,我的路由配置发生了这样的变化(添加了rule2):

routes.MapRoute(
        "rule2",
    "{controller}/{action}/{cid}/{language}/{phoneNumber}/{uid}",
    new { controller = "Home", action = "action2" }
    , new[] { "MVCApp.Controllers" }
);
routes.MapRoute(
        "rule1",
    "{controller}/{action}/{cid}/{language}/{itemID}/{uid}",
    new { controller = "Home", action = "action1" }
    , new[] { "MVCApp.Controllers" }
);

现在,当我致电http://localhost:51650/Home/action2/1/en/1/1时,它不会路由到action1并抛出异常The parameters dictionary contains a null entry for parameter 'itemID' of non-nullable type 'System.Int64' for method 'System.Web.Mvc.JsonResult action1(System.String, Int32, Int64, Int64)

1 个答案:

答案 0 :(得分:2)

您必须首先放置rule1然后再放置rule2声明。声明路由的顺序对api很重要,一旦请求与路由匹配,api就会停止搜索路由并转到指定的控制器。

这来自Pro ASP.NET Web API书:

  

根据您的需要,您可能希望拥有多个Web API   申请中的路线。这是一个完全可以接受的选择   ASP.NET Web API,但有一些重要的事情需要注意。   如果您有多条路线,则为路线的注册顺序   事项。当请求到达路由级别时,路由   扫描集合以查找匹配项。一找到匹配,   搜索停止,其余路径被忽略。首先   注册的路线将首先查看,依此类推。

因此,当您的两条路线具有相同的参数数量时,它将在与请求参数数量匹配的第一条路线上退出。要解决这个问题,您可以为路由添加约束,这样您就可以确保将值传递给路由的路径,或者将路由硬编码为rule1中的action1,将action2路由到规则2中的@Pavel。

对于将rule1始终路由到action1且将rule2始终路由到actoin2的操作的硬编码,请对action1使用{controller}/action1/{cid}/{language}/{itemID}/{uid}并对action2和rule2执行相同的操作