ASP.NET MVC маршрутизации с одним обязательным параметром и одним необязательным параметром?
Я работаю над большим MVC-приложением за последний месяц или около того, но это первый раз, когда мне когда-либо приходилось определять собственный обработчик маршрута, и у меня возникают некоторые проблемы. В основном у меня есть два параметра для прохождения. Первый необходим, а второй - необязательный.
Я следую этому ответу здесь.
Вот мой пользовательский маршрут:
routes.MapRoute(
"MyRoute",
"{controller}/{action}/{param1}/{param2}",
new {
controller = "MyController",
action = "MyAction",
param1 = "",
param2 = "" // I have also tried "UrlParameter.Optional" here.
}
);
И моя подпись метода действия:
public ActionResult MyAction(string param1, string param2)
Если я попробую URL http://[myserver]/MyController/MyAction/Test1/Test2
, то он будет работать так, как я ожидаю, с параметром param1 = "Test1" и param2 = "Test2"
Если я попробую URL http://[myserver]/MyController/MyAction/Test1
, то оба параметра равны нулю.
Надеюсь, кто-то может сказать мне, что я здесь делаю неправильно, потому что я потерялся.
Ответы
Ответ 1
Я предполагаю, что вы создали новый маршрут и оставили по умолчанию тот, который очень похож на ваш. Вы должны знать, что маршрут маршрута проходит, чтобы найти первый соответствующий маршрут. Поэтому, если вы оставили значение по умолчанию:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
над вашим маршрутом, то он будет соответствовать запросу http://[myserver]/My/MyAction/Test1
и вызовет MyController.MyAction
и установите "Text1" в параметр с именем id
. Это не будет выполнено, потому что это действие не объявляет одно имя id
.
Что вам нужно сделать, так это перенести свой маршрут как первый в списке маршрутов и сделать его более конкретным, чем сейчас:
routes.MapRoute(
"Route",
"My/{action}/{param1}/{param2}",
new
{
controller = "My",
action = "MyAction",
param1 = "",
param2 = ""
});
Это приведет к тому, что весь трафик маршрутизированного желоба My
будет соответствовать этому маршруту.
Ответ 2
Привет, вы создаете свой маршрут таким образом, я думаю, что это поможет вам
routes.MapRoute(
"Regis", // Route nameRegister
"Artical/{id}", // URL with parameters
new { controller = "Artical", action = "Show", id = UrlParameter.Optional } // Parameter defaults
);
Ответ 3
Попробуйте это
routes.MapRoute("MyRoute",
"myRoute/{param1 }/{param2 }",
new { controller = "MyController", action = "MyAction", param2 = UrlParameter.Optional },
new { param2 = @"\w+" });
вы можете указать один параметр как необязательный, используя " UrlParameter.Optional" и указанный второй с помощью DataType означает, что если вы передаете целочисленное значение, то DataType (@ "\ d +" ), а для строки я упоминание выше.
ПРИМЕЧАНИЕ: Последовательность параметра очень важна Необязательный параметр должен пройти наконец и зарегистрировать новый маршрут до маршрута по умолчанию В Gloab.asax.
тогда ссылка на действие, например
<a href="@Url.RouteUrl("MyRoute", new { param2 = "Test1",param1 = "Test2"})">Test</a>
ИЛИ с одним параметром
<a href="@Url.RouteUrl("MyRoute", new { param2 = "Test1"})">Test</a>
В контроллере
public ActionResult MyAction(string param2,string param1)
{
return View()
}