Tengo dos botones en mi formulario MVC:
<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />
Desde mi acción Controlador, ¿cómo sé cuál ha sido presionado?
Tengo dos botones en mi formulario MVC:
<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />
Desde mi acción Controlador, ¿cómo sé cuál ha sido presionado?
Respuestas:
Nombra ambos botones de envío de la misma manera
<input name="submit" type="submit" id="submit" value="Save" />
<input name="submit" type="submit" id="process" value="Process" />
Luego, en su controlador, obtenga el valor de envío. Solo el botón que se haga clic pasará su valor.
public ActionResult Index(string submit)
{
Response.Write(submit);
return View();
}
Por supuesto, puede evaluar ese valor para realizar diferentes operaciones con un bloque de interruptores.
public ActionResult Index(string submit)
{
switch (submit)
{
case "Save":
// Do something
break;
case "Process":
// Do something
break;
default:
throw new Exception();
break;
}
return View();
}
<button type="submit" name="action" value="draft"> Internationalized Save Text </button>
para fines de i18n, por lo que el usuario que enfrenta la cadena es personalizable y los nombres de los elementos de formulario nunca se exponen directamente al usuario (lo cual es extraño en sí mismo)
<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />
Y en su acción de controlador:
public ActionResult SomeAction(string submit)
{
if (!string.IsNullOrEmpty(submit))
{
// Save was pressed
}
else
{
// Process was pressed
}
}
esta es una mejor respuesta, por lo que podemos tener tanto texto como valor para un botón:
</p>
<button name="button" value="register">Register</button>
<button name="button" value="cancel">Cancel</button>
</p>
y el controlador:
public ActionResult Register(string button, string userName, string email, string password, string confirmPassword)
{
if (button == "cancel")
return RedirectToAction("Index", "Home");
...
en resumen, es un botón ENVIAR, pero usted elige el nombre usando el atributo de nombre, es aún más poderoso porque no está obligado a enviar el nombre o al botón en los parámetros del método del controlador, puede llamarlo como lo desee ...
Puede identificar su botón desde allí la etiqueta de nombre como a continuación, debe marcar así en su controlador
if (Request.Form["submit"] != null)
{
//Write your code here
}
else if (Request.Form["process"] != null)
{
//Write your code here
}
Aquí hay una manera muy agradable y sencilla de hacerlo con instrucciones realmente fáciles de seguir utilizando un MultiButtonAttribute personalizado:
Para resumir, haga que sus botones de envío sean así:
<input type="submit" value="Cancel" name="action" />
<input type="submit" value="Create" name="action" />
Tus acciones como esta:
[HttpPost]
[MultiButton(MatchFormKey="action", MatchFormValue="Cancel")]
public ActionResult Cancel()
{
return Content("Cancel clicked");
}
[HttpPost]
[MultiButton(MatchFormKey = "action", MatchFormValue = "Create")]
public ActionResult Create(Person person)
{
return Content("Create clicked");
}
Y crea esta clase:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class MultiButtonAttribute : ActionNameSelectorAttribute
{
public string MatchFormKey { get; set; }
public string MatchFormValue { get; set; }
public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
{
return controllerContext.HttpContext.Request[MatchFormKey] != null &&
controllerContext.HttpContext.Request[MatchFormKey] == MatchFormValue;
}
}
MultiButtonAttribute
atributo personalizado para permitir la diferenciación entre los botones de envío. En realidad es una buena idea.
Arnis L.
hubiera seguido el mismo consejo, es posible que haya notado que él proporcionó exactamente el mismo enlace 4 años antes:>
// Buttons
<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />
// Controller
[HttpPost]
public ActionResult index(FormCollection collection)
{
string submitType = "unknown";
if(collection["submit"] != null)
{
submitType = "submit";
}
else if (collection["process"] != null)
{
submitType = "process";
}
} // End of the index method
Para hacerlo más fácil, diré que puede cambiar sus botones a lo siguiente:
<input name="btnSubmit" type="submit" value="Save" />
<input name="btnProcess" type="submit" value="Process" />
Su controlador:
public ActionResult Create(string btnSubmit, string btnProcess)
{
if(btnSubmit != null)
// do something for the Button btnSubmit
else
// do something for the Button btnProcess
}
Esta publicación no va a responder a Coppermill, porque le han respondido hace mucho tiempo. Mi publicación será útil para quién buscará una solución como esta. En primer lugar, tengo que decir "La solución de WDuffy es totalmente correcta" y funciona bien, pero mi solución (no la mía) se utilizará en otros elementos y hace que la capa de presentación sea más independiente del controlador (porque su controlador depende de "valor" que se utiliza para mostrar la etiqueta del botón, esta función es importante para otros idiomas).
Aquí está mi solución, dales diferentes nombres:
<input type="submit" name="buttonSave" value="Save"/>
<input type="submit" name="buttonProcess" value="Process"/>
<input type="submit" name="buttonCancel" value="Cancel"/>
Y debe especificar los nombres de los botones como argumentos en la acción como a continuación:
public ActionResult Register(string buttonSave, string buttonProcess, string buttonCancel)
{
if (buttonSave!= null)
{
//save is pressed
}
if (buttonProcess!= null)
{
//Process is pressed
}
if (buttonCancel!= null)
{
//Cancel is pressed
}
}
cuando el usuario envía la página usando uno de los botones, solo uno de los argumentos tendrá valor. Supongo que esto será útil para otros.
Actualizar
Esta respuesta es bastante antigua y en realidad reconsidero mi opinión. tal vez la solución anterior sea buena para la situación que pasa el parámetro a las propiedades del modelo. no se molesten y tomen la mejor solución para su proyecto.
input[type=submit]
valor que se activó, por lo que todos los modelos pueden vincularse a una propiedad con la misma name
(ej. action
) Y luego puede diferenciar los botones en función value
de esa cadena sin la necesidad de introducir tantas variables en su firma . Por favor, tómese un tiempo para pensar en formatear / sangrar antes de publicar.
Dé el nombre a ambos botones y obtenga el cheque del valor del formulario.
<div>
<input name="submitButton" type="submit" value="Register" />
</div>
<div>
<input name="cancelButton" type="submit" value="Cancel" />
</div>
En el lado del controlador:
public ActionResult Save(FormCollection form)
{
if (this.httpContext.Request.Form["cancelButton"] !=null)
{
// return to the action;
}
else if(this.httpContext.Request.Form["submitButton"] !=null)
{
// save the oprtation and retrun to the action;
}
}
En las páginas Core 2.2 Razor, esta sintaxis funciona:
<button type="submit" name="Submit">Save</button>
<button type="submit" name="Cancel">Cancel</button>
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
return Page();
var sub = Request.Form["Submit"];
var can = Request.Form["Cancel"];
if (sub.Count > 0)
{
.......
string submit
escritura string submit = Request.Form["Submit"];
. Uno de los mayores beneficios de Razor Pages y / o MVC es la legibilidad de los métodos, de lo contrario podría ser PHP.
<input name="submit" type="submit" id="submit" value="Save" onclick="saveMethod" />
:?