我目前正在使用MVC路由和MvcSiteMapProvider
。我刚刚注意到一些我不确定的事情:
[Route("mypath/{param1}/{param2}/{param3:int}/", Name = "myaction")]
[MvcSiteMapNode(Title = "My Thing", ParentKey = "myparent", Key = "myaction", PreservedRouteParameters = "param1, param2, param3")]
public ActionResult myaction(string param1, string param2, int param3)
{
mymodel model = gd.getmydata(param3);
var node = SiteMaps.Current.CurrentNode;
node.Title = model.name;
node.ParentNode.Title = location;
node.ParentNode.RouteValues["param"] = location;
return View(model);
}
当我测试网址时,我是如何设计的:
http://localhost:12345/mypath/param1/param2/param3
但是,如果我使用param2或param3中的drivel对URL进行混蛋,则视图仍会解析而不会出现错误。只有通过改变mypath或param3才能完成404:
http://localhost:12345/mypath/drivel/param2/param3
http://localhost:12345/mypath/param1/drivel/param3
我错过了什么吗?我应该在控制器中进行参数验证吗?
答案 0 :(得分:1)
路径的URL参数中的标记就像变量一样。您配置路线的方式将始终匹配以mypath/
开头且包含3个其他细分的任何网址。路径不关心将哪些值放入这些段中,它会将它们变为名为param1
,param2
和param3
的路由键,其中包含实际URL中的任何值。
如果您希望路径仅与网址/mypath/param1/param2/param3
匹配,则需要使用文字路径段。
[Route("mypath/param1/param2/param3/", Name = "myaction")]
但是,由于您的param3
段是一个整数值而您的网址包含字符串,因此很难说出您要实现的目标。如果您将其声明为整数,则必须在URL中放置一个整数,否则您将收到错误。
/mypath/param1/param2/123
如果您在网址中使用文字细分,则需要注意的另一件事是,它们不会转换为路线值,因此在这种情况下无需使用PreservedRouteParamters
。
因此,如果您使用变量声明路线,那么任何值都可以使用并不奇怪。如果需要显式路由,请使用文字段声明它。如果您想要变量但希望将路径限制为特定范围的可能值,则需要使用路径约束。