MVC Routing - вопрос об именах параметров
-
19-08-2019 - |
Вопрос
Я ищу некоторую информацию о маршрутизации в MVC с C #. В настоящее время я очень хорошо знаком с основами маршрутизации в MVC, но то, что я ищу, довольно сложно найти. Р>
По сути, я хочу найти способ определения одного маршрута, который принимает один параметр.
Типичные примеры, которые я нашел в Интернете, основаны на примере
routes.MapRoute(
"Default",
"{controller}.mvc/{action}/{id}"
new { controller = "Default", action="Index", id=""});
Сопоставляя этот маршрут, вы можете сопоставить любое действие в любом контроллере, но если вы хотите передать что-либо в действие, параметр метода должен называться " id " ;. Я хочу найти способ обойти это, если это возможно, чтобы мне не приходилось постоянно указывать маршруты, просто чтобы использовать другое имя параметра в моих действиях.
У кого-нибудь есть идеи, или нашли способ обойти это?
Решение
Вы можете строить маршруты так, как вам нравится
routes.MapRoute(
"Default",
"{controller}.mvc/{action}/{param1}/{param2}/{param3}"
new { controller = "Default", action="Index", param1="", param2="", param3=""});
Кроме того, посмотрите этот пост , он содержит все виды примеров в разделе комментариев
Другие советы
Если вы хотите, чтобы другое имя параметра и оставляли одну и ту же переменную маршрутизации, используйте атрибут FromUri следующим образом:
public ActionResult MyView([FromUri(Name = "id")] string parameterThatMapsToId)
{
// do stuff
}
В ваших маршрутах все, что вам нужно, это:
routes.MapRoute(
"Default",
"{controller}.mvc/{action}/{id}"
new { controller = "Default", action="Index", id=""});
Я не думаю, что вы можете сделать именно то, что вы просите. Когда MVC вызывает действие, он ищет параметры в маршрутах, параметрах запроса и строке запроса. Он всегда ищет соответствие имени параметра. Р>
Возможно, старая добрая строка запроса будет соответствовать вашим потребностям.
~/mycontroller/myaction/?foobar=123
передаст 123 этому действию:
public ActionResult MyAction(int? foobar)
Я знаю, что это было много веков назад, но надеюсь, что это все еще кому-то поможет. Я задавал тот же вопрос раньше. Я думаю, это то, что вы ищете. Ответ процитирован из моего поста с вопросом:
" Бит {* pathInfo} называется слагом. в основном это подстановочный знак, говорящий " все, что после этой точки вставлено в параметр с именем pathInfo " Таким образом, если у вас есть & Quot; {resource} .axd / {* pathInfo} & Quot; и URL-адрес, подобный следующему: http://blah/foo.axd/foo/bar/baz/bing
тогда создаются два параметра: один называется ресурсом, который будет содержать foo, а другой - pathInfo, содержащий foo / bar / baz / bing. " Р>
Хотя вы все еще не можете использовать атрибут FromUri
, вы можете использовать атрибут Route
, например
[Route("~/Policy/PriorAddressDelete/{sequence}")]
public ActionResult PriorAddressDelete(int sequence)
{
Policy.RemoveScheduledPriorAddressItem(sequence);
return RedirectToAction("Information", new { id = Policy.Id });
}
Технически это добавляет новый маршрут, но, по крайней мере, он не загромождает ваш routeconfig
. Он помещает определение маршрута туда, где он используется, что мне нравится (меньше охоты на вещи).
Помните, чтобы использовать маршрутизацию атрибутов, это должно быть в вашем файле routeconfig над указанными вами маршрутами:
routes.MapMvcAttributeRoutes();