Использование Html.BeginForm () с пользовательскими маршрутами - PullRequest
30 голосов
/ 29 ноября 2011

Это, как вы наверняка знаете, маршрут по умолчанию:

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Start", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

Допустим, я использую метод BeginForm () следующим образом:

@using (Html.BeginForm("MyAction", "MyController", new { id = 4 }))

Это отобразит следующий тег формы:

<form method="post" action="/MyController/MyAction/4">

Теперь предположим, что я создал собственный маршрут:

routes.MapRoute(
    "MyCustomRoute", // Route name
    "MyController/{id}/{action}", // URL with parameters
    new { controller = "MyController", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

Когда я создаю форму, мне бы хотелось, чтобы она выглядела следующим образом:

<form method="post" action="/MyController/4/MyAction">

Однако, если я использую BeginForm (), как в примере выше, я получу URL, который соответствует маршруту по умолчанию. Есть ли способ указать BeginForm () использовать мой собственный маршрут вместо маршрута по умолчанию при создании URL-адреса для действия? Или BeginForm () всегда создает URL-адреса, которые соответствуют шаблону маршрута по умолчанию?

Я использую asp.net mvc 3, если это имеет значение.

Ответы [ 3 ]

41 голосов
/ 29 ноября 2011

Вы можете использовать метод Html.BeginRouteForm() из класса HtmlHelper.

@Html.BeginRouteForm("MyCustomRoute", 
   new { controller = "MyController", action = "MyAction" })
5 голосов
/ 29 ноября 2011

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

Поскольку метод BeginForm не добавляет большого значения, вы можете использовать элемент формы HTML для создания формы и создания действия с помощью @ Url.RouteUrl (), как-то так

@Url.RouteUrl("MyCustomRoute", new { controller = "MyController", action = "MyAction" })

Обратите внимание, что я здесь использую именованный маршрут!

1 голос
/ 03 сентября 2015

Если вы уже определили маршрут в вашем global.asax, вы можете использовать этот синтаксис:

global.asax:

routes.MapRoute("MyCustomRoute", "my-controller/{action}",
    new { controller = "MyController", action = "Index" });

контроллер (MyControllerController.cs):

[ActionName("my-action")]
public ActionResult MyAction()
{
}

просмотр бритвы (my-action.cshtml):

@Html.BeginRouteForm("MyCustomRoute", new { action = "my-action" })
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...