2017-02-22 100 views
0

我曾与路由配置规则,包括一个ASP.Net MVC应用这一个:asp.net MVC路由配置

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

我刚添加了新的动作与相同数量的参数和我的路由配置变化如下(规则2加):

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

反转的顺序。添加路由的顺序影响路由的工作方式。添加第一个rule1,然后添加rule2 – NicoRiff

+0

@NicoRiff我刚刚更新了异常详细信息。有什么办法,信息不会路由到rule2和路由跳过它,并采取行动中的rule1(对于URL http://本地主机:51650 /主页/操作2/1/en/1/1)? – VSB

回答

2

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

这是从Pro ASP.NET Web API书:

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

因此,由于您的两条路线具有相同的参数数量,它将在第一条与请求参数数量匹配的路线上退出。为了解决这个问题,你可以在你的路由中添加约束条件,这样你就可以确保什么值到什么路由,或者按照规定,将你的路由硬编码为rule1中的action1,action2中的rule2作为@Pavel。

对于行动的硬编码到航线规则1始终动作1和规则2总是actoin2,用途:{controller}/action1/{cid}/{language}/{itemID}/{uid}的动作1和做动作2相同,规则2

+0

如何在rule2或rule1中硬编码动作?由于更改订单将导致其他操作发生相同的错误。 – VSB

+0

当有人输入action1应该去规则1和动作2到规则2? – NicoRiff

+0

我应该注意'phoneNumber'是'string','itemId'是'int',当我颠倒规则的顺序时,当信息路由到action2时'phoneNumber'将为空。 – VSB