MVC Routing - вопрос с именами параметров

Я ищу некоторую информацию о маршрутизации в MVC с помощью С#. В настоящее время я очень хорошо разбираюсь в основах маршрутизации в MVC, но то, что я ищу, довольно сложно найти.

Фактически, я хочу найти способ определения одного маршрута, который принимает один параметр.

Общие примеры, которые я нашел онлайн, основаны на примере

routes.MapRoute(
    "Default",
    "{controller}.mvc/{action}/{id}"
    new { controller = "Default", action="Index", id=""});

При сопоставлении этого маршрута вы можете сопоставить любое действие любого контроллера, но если вы хотите передать что-либо в действие, параметр метода должен быть назван "id". Я хочу найти способ обойти это, если это возможно, так что мне не нужно постоянно указывать маршруты, просто чтобы использовать другое имя параметра в моих действиях.

Есть ли у кого-нибудь какие-либо идеи или нашли способ обойти это?

Ответ 1

Вы можете создавать маршруты по своему усмотрению

routes.MapRoute(
    "Default",
    "{controller}.mvc/{action}/{param1}/{param2}/{param3}"
    new { controller = "Default", action="Index", param1="", param2="", param3=""});

Кроме того, посмотреть это сообщение, он содержит все образцы в разделе комментариев

Ответ 2

Если вы хотите иметь другое имя параметра и сохранить одну и ту же переменную маршрутизации, используйте атрибут FromUri следующим образом:

public ActionResult MyView([FromUri(Name = "id")] string parameterThatMapsToId)
{
   // do stuff
}

В ваших маршрутах все, что вам нужно, это:

routes.MapRoute(
  "Default",
  "{controller}.mvc/{action}/{id}"
  new { controller = "Default", action="Index", id=""});

Ответ 3

Я не думаю, что вы можете делать именно то, что вы просите. Когда MVC вызывает действие, он ищет параметры в маршрутах, запрашивает параметры и строку запроса. Он всегда ищет соответствие имени параметра.

Возможно, хорошая старая строка запроса удовлетворит ваши потребности.

~/mycontroller/myaction/?foobar=123

передаст 123 этому действию:

public ActionResult MyAction(int? foobar)

Ответ 4

Я знаю, что это столетия назад, но надеюсь, что это все еще помогает кому-то. Я задал тот же вопрос раньше. Я думаю, что это то, что вы ищете. Ответ, процитированный из моего вопроса: "Бит {* pathInfo} называется slug, в основном это подстановочный знак" все после того, как эта точка забита в параметр pathInfo ". Таким образом, если у вас есть" {resource}.axd/{* pathInfo} "и URL-адрес например: http://blah/foo.axd/foo/bar/baz/bing затем создаются два параметра, один называется ресурсом, который будет содержать foo и один называется pathInfo, который содержит foo/bar/baz/bing."

Ответ 5

Хотя вы все еще не можете использовать атрибут FromUri, вы можете использовать атрибут Route, например

[Route("~/Policy/PriorAddressDelete/{sequence}")]
public ActionResult PriorAddressDelete(int sequence)
{
  Policy.RemoveScheduledPriorAddressItem(sequence);
  return RedirectToAction("Information", new { id = Policy.Id });
}

Технически это добавляет новый маршрут, но по крайней мере он не загромождает ваш routeconfig. Он ставит определение маршрута прямо там, где он используется, что мне нравится (менее охота на вещи).

Помните, что для использования маршрутизации атрибутов это должно быть в вашем файле routeeconfig выше ваших определенных маршрутах:

routes.MapMvcAttributeRoutes();