type net mvc multiple form cshtml buttons asp c# asp.net-core asp.net-core-mvc

c# - multiple - ASP.NET MVC Core/6: Múltiples botones de envío



mvc multiple submit buttons (2)

ASP.NET Core 1.1.0 tiene el FormActionTagHelper que crea un atributo de formaction .

<form> <button asp-action="Login" asp-controller="Account">log in</button> <button asp-action="Register" asp-controller="Account">sign up</button> </form>

Eso hace como esto:

<button formaction="/Account/Login">log in</button> <button formaction="/Account/Register">sign up</button>

También funciona con etiquetas de input que son type="image" o type="submit" .

Necesito varios botones de envío para realizar diferentes acciones en el controlador.

Vi una solución elegante aquí: ¿Cómo maneja los botones de envío múltiple en ASP.NET MVC Framework? Con esta solución, los métodos de acción se pueden decorar con un atributo personalizado. Cuando se procesan las rutas, un método de este atributo personalizado verifica si la propiedad del atributo coincide con el nombre del botón de envío en el que se hizo clic.

Pero en MVC Core (compilación nocturna de RC2) no he encontrado ActionNameSelectorAttribute (también busqué en el repositorio de Github). Encontré una solución similar que utiliza ActionMethodSelectorAttribute ( http://www.dotnetcurry.com/aspnet-mvc/724/handle-multiple-submit-buttons-aspnet-mvc-action-methods ).

ActionMethodSelectorAttribute está disponible, pero el método IsValidForRequest tiene una firma diferente. Hay un parámetro de tipo RouteContext . Pero no pude encontrar los datos del post allí. Así que no tengo nada que comparar con mi propiedad de atributo personalizado.

¿Existe una solución elegante similar disponible en MVC Core como las de versiones anteriores de MVC?


Puede usar el atributo de formaction HTML5 para esto, en lugar de formaction del lado del servidor.

<form action="" method="post"> <input type="submit" value="Option 1" formaction="DoWorkOne" /> <input type="submit" value="Option 2" formaction="DoWorkTwo"/> </form>

Entonces simplemente tiene acciones de control como esta:

[HttpPost] public IActionResult DoWorkOne(TheModel model) { ... } [HttpPost] public IActionResult DoWorkTwo(TheModel model) { ... }

Un buen polyfill para navegadores más antiguos se puede encontrar aquí .

Manten eso en mente...

  1. El primer botón de envío siempre se elegirá cuando el usuario presione el retorno de carro.
  2. Si se produce un error, ModelState u otro, en la acción que también se publicó, deberá enviar al usuario a la vista correcta. (Sin embargo, esto no es un problema si está publicando a través de AJAX).