0

В настоящее время я использую MVC Routing и MvcSiteMapProvider. Я просто заметил, что-то, я не уверен насчет:MVC Маршрутизация фиктивных URL-адресов разрешена

[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); 
} 

Когда я проверить URL-адрес, как я проектировал это:

http://localhost:12345/mypath/param1/param2/param3 

Однако если я bastardise по URL с бессмыслицы в Param2 или Param3 мнение по-прежнему разрешается без ошибок. Только путем изменения mypath или param3 делает это 404:

http://localhost:12345/mypath/drivel/param2/param3 
http://localhost:12345/mypath/param1/drivel/param3 

Я что-то упустил? Должен ли я иметь проверку параметров в контроллере?

ответ

1

Токены в URL-адресе маршрута действуют как переменные. Как вы настроили свой маршрут, он всегда будет соответствовать любому URL, начинающемуся с mypath/ и содержащему 3 дополнительных сегмента. Маршруту все равно, какие значения будут помещены в эти сегменты, он превратит их в ключи маршрута с именем param1, param2 и param3, содержащие любые значения в фактическом URL-адресе.

Если вы хотите, чтобы маршрут только соответствовал URL-адресу /mypath/param1/param2/param3, вам нужно будет использовать литальные сегменты маршрута.

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

Но, так как ваш param3 сегмент представляет собой целое значение и ваш URL содержит строку, то трудно сказать, что вы пытаетесь достичь. Если вы объявите его целым числом, вы должны поместить в URL целое число или вы получите сообщение об ошибке.

/mypath/param1/param2/123 

Еще одна вещь, чтобы отметить, если вы используете буквенные сегменты в вашем URL является то, что они не преобразуются в значения маршрута, поэтому нет необходимости использовать PreservedRouteParamters в этом случае.

Итак, если вы объявляете свой маршрут с помощью переменных, это не должно удивлять, что любое значение работает. Если вам нужен явный маршрут, объявите его с литеральными сегментами. Если вы хотите переменные, но хотите ограничить маршрут определенным диапазоном возможных значений, вам необходимо использовать ограничения маршрута.

+0

Здравствуйте. То, что я пытаюсь достичь, - это URL-адрес, чтобы указать местоположение («essex») в param1, описание продукта в param2 («показать») и идентификатор базы данных в param3 (1234). URL должен быть mypath/essex/show/1234. Эти значения всегда будут меняться, поэтому литерал не будет работать. Могу ли я ограничить использование списка . Содержит? – Scott

+0

Есть несколько вариантов. Можно было бы сделать [Ограничение маршрута RegEx] (http://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/creating-a-route-constraint-cs) или [ пользовательское ограничение маршрута] (http://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/creating-a-custom-route-constraint-cs) для каждого сегмента. Или вы могли бы поставить логику прямо в свой контроллер (или службу, которая была введена в нее), чтобы ограничить его и вернуть 404 не найден, если значения не соответствуют существующей возможности. Вы также можете сделать то и другое. – NightOwl888

+0

Спасибо. Я начну с контроллера. – Scott

Смежные вопросы