【问题标题】:asp.net MVC routing configurationasp.net MVC 路由配置
【发布时间】:2017-07-12 20:49:05
【问题描述】:

我有一个带有路由配置规则的 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)

【问题讨论】:

  • 倒序。添加路由的顺序会影响路由的工作方式。添加第一个规则1,然后添加规则2
  • @NicoRiff 我刚刚更新了异常详细信息。有什么方法可以使信息不路由到 rule2 并且路由会跳过它并执行 rule1(对于 url http://localhost:51650/Home/action2/1/en/1/1)?

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


【解决方案1】:

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

这是来自Pro ASP.NET Web API 的书:

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

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

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

【讨论】:

  • 如何在规则 2 或规则 1 中硬编码操作?由于更改顺序会导致其他操作出现相同的错误。
  • 当有人输入action1应该转到rule1而action2应该转到rule2?
  • 我应该注意 phoneNumberstringitemIdint 并且当我颠倒规则的顺序时,phoneNumber 将在信息被路由到 action2 时为空。
  • when someone input action1 is supposed to go to rule1 and action2 to rule2 --> 是的,没错
  • 对 action1 使用:“{controller}/action1/{cid}/{language}/{itemID}/{uid}”,对 action2 和 rule2 执行相同操作
猜你喜欢
  • 2021-04-23
  • 1970-01-01
  • 2015-12-09
  • 2014-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多