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...
- El primer botón de envío siempre se elegirá cuando el usuario presione el retorno de carro.
- 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).