C# ASP.NET MVC路由问题中的约束

C# ASP.NET MVC路由问题中的约束,c#,asp.net-mvc-4,C#,Asp.net Mvc 4,我试图从中创建一个示例 他们定义了一条路线,如: routes.MapRoute( "Product", "Product/{productId}", new {controller="Product", action="Details"}, new {productId = @"\d+" } ); 这意味着当productId没有整数值时,将出现资源找不到的错误。(I访问后显示错误,否则将显示视图) 但如果我将url格式从route更改为: "Product/

我试图从中创建一个示例

他们定义了一条路线,如:

routes.MapRoute(
    "Product",
    "Product/{productId}",
    new {controller="Product", action="Details"},
    new {productId = @"\d+" }
);
这意味着当productId没有整数值时,将出现资源找不到的错误。(I访问后显示错误,否则将显示视图)

但如果我将url格式从route更改为:

"Product/{action}/{productId}"
然后发生一个错误,如:
参数字典包含一个空条目,用于方法的不可为空类型“System.Int32”的参数“productId”

那么,为什么不显示资源找不到的
错误?为什么在我对路由设置约束时执行操作

PS:我更改了route的url格式,现在看起来像:

routes.MapRoute(
    "Product",
    "Product/{action}/{productId}",
    new {controller="Product", action="Details"},
    new {productId = @"\d+" }
);

原因不是您指定的路线,而是代码中的另一个路线项目,很可能是默认MVC路线:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

productId
的值与约束不匹配时,路由引擎将继续检查下一个映射。然后它与最后一个匹配,但是当试图调用您的方法时,模型绑定器无法将字符串
1a
转换为
int
,这实际上意味着
productId
参数丢失。

为什么找不到资源

routes.MapRoute(
    "Product",
    "Product/{productId}",
    new {controller="Product", action="Details"},
    new {productId = @"\d+" }
);
当url为
http://website.com/product/1a

回答:您的获取错误,因为当您在url路由上应用约束时,如果约束与MVC不匹配,请拒绝该请求。这是您获取未找到资源错误的唯一原因


为什么错误
参数字典包含不可为空的类型为'System.Int32'的参数'productId'的空条目,用于

routes.MapRoute(
    "Product",
    "Product/{action}/{productId}",
    new {controller="Product", action="Details"}
);
当url
http://website.com/Product/Details/1a

答:在这种情况下,没有应用RoutConstraint,因此
ModelBinder
尝试使用
DefaultValuProvider
匹配参数,如果它无法将值匹配到参数,则会抛出错误,因为没有转换意味着空值

要避免此错误,您可以尝试以下操作

a。将解除值传递给操作方法

  public ActionResult Index(int id=0)
b。使用可为null的参数创建方法,以便自动处理null

  public ActionResult Index(int? id)

问题不是因为约束路径

routes.MapRoute(
    "Product",
    "Product/{productId}",
    new {controller="Product", action="Details"},
    new {productId = @"\d+" }
);
根据上述规范,您要查找的产品id是整数,因此如果您提供类似
http://website.com/Product/Details/1a
它尝试将第一个值与第一个页眉匹配,在这种情况下,表示产品与productId匹配后的任何内容……要匹配此mvc,请在模块绑定器找到其
string
not
int

因此,根据您的路线,它将
详细信息与产品id匹配,但无法找到
1a的匹配项,这就是您无法找到资源的原因。



当您有这样的路由
Product/{action}/{productId}
并像这样调用url
http://website.com/Product/Details/1a
它将
详细信息
{action}
匹配,将
1a
{ProductId}匹配
之后出现错误
参数字典包含不可为空类型的“System.Int32”参数“productId”的空条目,用于方法

您到底更改了什么?路线看起来如何?请参阅更新的问题。我已经解释了我所做的更改。这个答案对你有用吗?我更新了我的答案,为什么你会出错…id是可选的(在默认路由中),如果它为null,则不应引发此异常。在提供了所有的id并且没有丢失之后..因为
id
是可选的,所以这条路线会匹配。我同意你的观点,这条路线会匹配。但是id是提供的,并且没有丢失。确切地说,这就是错误发生的原因,它来自控制器操作调用程序,而不是404。它丢失是因为模型绑定器无法将
1a
转换为不可为null的int。这就是他没有获得资源未找到错误的原因;)例如,我没有访问
http://website.com/Product/Details/1a
但是
http://website.com/Product/1a
正如您所看到的,缺少详细信息
(这就是为什么工作的原因)@SnakeEyes-检查您可能要查找的答案