asp.net маршрутизация mvc: как использовать действие по умолчанию, но не параметр по умолчанию?
я переписываю вопрос, поскольку ответы до сих пор показывают мне, что я не определил его достаточно хорошо. Я оставлю оригинальный вопрос Для справки ниже.
при настройке маршрутизации можно указать значения по умолчанию для различных частей url / маршрута. Рассмотрим пример, который VS wizard генерирует:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "DefaultPage", action = "Index", id = UrlParameter.Optional } // Parameter defaults
в этом примере, если контроллер не указан, будет использоваться DefaultPageController и если действие не указано, будет использоваться действие "индекс".
URL-адреса будет вообще выглядеть так: http://mysite/MyController/MyAction
.
если в Url нет такого действия:http://mysite/MyController
затем будет использоваться действие индекса.
теперь предположим, что у меня есть два действия в моем индексе контроллера и AnotherAction. URL-адреса, которые им соответствуют, являются http://mysite/MyController
и http://mysite/MyController/AnotherAction
соответственно. Мое действие "индекс" принимает параметр id. Поэтому, если мне нужно передать параметр в действие индекса, я могу сделать следующее:http://mysite/MyController/Index/123
. Обратите внимание, что в отличие от URL http://mysite/MyController
, Я должен указать индекс действие явно. То, что я хочу сделать, это иметь возможность пройти http://mysite/MyController/123
вместо http://mysite/MyController/Index/123
. Мне не нужен "индекс" в этом URL, я хочу, чтобы движок mvc распознал, что когда я прошу http://mysite/MyController/123
, что 123 - это не действие (потому что я не определил действие с этим именем), а параметр моего действия по умолчанию "индекс". Как настроить маршрутизацию для достижения этой цели?
ниже приведена первоначальная формулировка вопроса.
у меня есть контроллер с двумя методами определили вот так
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(SomeFormData data)
{
return View();
}
это позволяет мне обрабатывать Url как http://website/Page
и когда пользователь переходит к этому url (GET), и когда они впоследствии отправляют обратно форму (POST).
теперь, когда я обрабатываю сообщение обратно, в некоторых случаях я хочу перенаправить браузер на этот url:
http://website/Page/123
где 123 - некоторое целое число, и мне нужен метод для обработки этого url-адреса в моем контроллере.
как настроить маршрутизацию, чтобы это работало? В Настоящее Время I имейте маршрутизацию "по умолчанию", сгенерированную мастером следующим образом:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "DefaultPage", action = "Index", id = UrlParameter.Optional } // Parameter defaults
я попытался добавить другой метод контроллера, как это:
public ActionResult Index(int id)
{
return View();
}
но это не работает, так как возникает исключение неоднозначного действия:
текущий запрос на действие "индекс" на типе контроллера 'PageController' неоднозначен между следующих метод действия: Система.Сеть.В MVC.ActionResult Index () on PageController тип Система.Сеть.В MVC.ActionResult Индекс (Int32) по типу PageController
я должен добавить, что у меня также есть другие действия в этом контроллере. этой сработало бы, если бы я этого не сделал.
4 ответов
вот как это можно решить:
вы можете создать ограничение маршрута, чтобы указать движку маршрутизации, что если у вас есть что-то в url-адресе, которое выглядит как число (123), то это параметр действия для действия по умолчанию, и если у вас есть что-то, что не похоже на число (AnotherAction), то это действие.
рассмотрим этот код:
routes.MapRoute(
"MyController", "MyController/{productId}",
new {controller="My", action="Index"},
new {productId = @"\d+" });
это определение маршрута будет соответствовать только числовым значениям после MyController в http://mysite/MyController/123
так это не будет мешать вызову другого действия на том же контроллере.
источник: создание ограничения маршрута
Если вы сохраняете имя переменной, чтобы оставаться ID, вам не нужно ничего менять.
переименуйте post one в "PostIndex" и добавьте этот атрибут:
[ActionName("Index")]
тот же вопрос на SO здесь.
хорошо, вот ответ вырезать / вставить для вас, если это поможет.
public ActionResult Index() {
return View();
}
[AcceptVerbs(HttpVerbs.Post), ActionName("Index")]
public ActionResult PostIndex(SomeFormData data) {
return View();
}
О, теперь я понял. Я думаю, что это невозможно с маршрутом по умолчанию, вам нужно отобразить пользовательские маршруты.
// /MyController/AnotherAction
routes.MapRoute(
null,
"MyController/AnotherAction",
new { controller = "DefaultPage", action = "AnotherAction" }
);
// /MyController
// /MyController/id
routes.MapRoute(
null,
"MyController/{id}",
new { controller = "DefaultPage", action = "Index", id = UrlParameter.Optional }
);
ps. Маршруты по умолчанию как /MyController / id должен отображаться наконец.
Я думаю, вы хотите вернуть тот же вид, но вам нужно понять, что вы делаете две разные вещи. Один-receive post, а другой-доступ по get, а другой-доступ по get и параметру...
вы должны сделать 3 actionresult с разными именами и вернуть тот же вид, что и View ("ThisIsTheResult")