我有一个带有路由配置规则的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 票数: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,请对动作1使用{controller}/action1/{cid}/{language}/{itemID}/{uid} ,对action2和rule2执行相同的操作

  ask by VSB translate from so

未解决问题?本站智能推荐: