tag route net for beginform asp asp.net-mvc asp.net-mvc-3

asp.net-mvc - route - tag helpers asp net core



Usando Html.BeginForm() con rutas personalizadas (3)

Esto es como seguramente sabes la ruta por defecto:

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

Digamos que uso el método BeginForm () de esta manera:

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

Esto representará la siguiente etiqueta de formulario:

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

Ahora, digamos que he hecho una ruta personalizada:

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

Cuando creo un formulario me gustaría que se vea así:

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

Sin embargo, si uso BeginForm () como en el ejemplo anterior, obtendré una url que coincide con la ruta predeterminada. ¿Hay una manera de decirle a BeginForm () que use mi ruta personalizada en lugar de la predeterminada al crear la url para la acción? ¿O BeginForm () siempre produce urls que siguen el patrón de ruta predeterminado?

Estoy usando asp.net mvc 3 si importa.


La razón de ello es que el sistema de enrutamiento elige la primera ruta que coincida para construir la ruta. Entonces, para evitar este problema, puede reordenar sus rutas, pero eso es bastante frágil.

Ya que el método BeginForm no agrega mucho valor, podría usar el elemento de formulario HTML para construir su formulario y generar la acción a través de un @ Url.RouteUrl () de alguna manera como esto

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

Tenga en cuenta que estoy usando una ruta con nombre aquí!


Puede usar el método Html.BeginRouteForm() de la clase HtmlHelper.

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


Si ya definió la ruta en su global.asax, puede usar esta sintaxis:

global.asax:

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

controlador (MyControllerController.cs):

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

vista de la maquinilla de afeitar (my-action.cshtml):

@Html.BeginRouteForm("MyCustomRoute", new { action = "my-action" }) { }