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"}
);
当urlhttp://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
notint
因此,根据您的路线,它将详细信息与产品id匹配,但无法找到1a的匹配项,这就是您无法找到资源的原因。
当您有这样的路由Product/{action}/{productId}
并像这样调用urlhttp://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-检查您可能要查找的答案