允许MVC路由虚假URL

时间:2015-08-07 08:37:55

标签: asp.net-mvc routes url-routing asp.net-mvc-routing mvcsitemapprovider

我目前正在使用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

我错过了什么吗?我应该在控制器中进行参数验证吗?

1 个答案:

答案 0 :(得分:1)

路径的URL参数中的标记就像变量一样。您配置路线的方式将始终匹配以mypath/开头且包含3个其他细分的任何网址。路径不关心将哪些值放入这些段中,它会将它们变为名为param1param2param3的路由键,其中包含实际URL中的任何值。

如果您希望路径与网址/mypath/param1/param2/param3匹配,则需要使用文字路径段。

[Route("mypath/param1/param2/param3/", Name = "myaction")]

但是,由于您的param3段是一个整数值而您的网址包含字符串,因此很难说出您要实现的目标。如果您将其声明为整数,则必须在URL中放置一个整数,否则您将收到错误。

/mypath/param1/param2/123

如果您在网址中使用文字细分,则需要注意的另一件事是,它们不会转换为路线值,因此在这种情况下无需使用PreservedRouteParamters

因此,如果您使用变量声明路线,那么任何值都可以使用并不奇怪。如果需要显式路由,请使用文字段声明它。如果您想要变量但希望将路径限制为特定范围的可能值,则需要使用路径约束。