我有一个带有路由配置规则的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)
。
答案 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执行相同的操作