Подтвердить что ты не робот

Использование Html.BeginForm() с настраиваемыми маршрутами

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

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, если это имеет значение.

4b9b3361

Ответ 1

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

@Html.BeginRouteForm("MyCustomRoute", 
   new { controller = "MyController", action = "MyAction" })

Ответ 2

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

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

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

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

Ответ 3

Если вы уже определили маршрут в своем 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" })
{
}