Pregunta

Tengo dos botones de mi forma MVC:

<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />

Desde mi acción del controlador, ¿cómo sé cuál ha sido presionado?

¿Fue útil?

Solución

Nombre tanto el botones de envío el mismo

<input name="submit" type="submit" id="submit" value="Save" />
<input name="submit" type="submit" id="process" value="Process" />

A continuación, en el controlador de obtener el valor de someterse. Sólo hace clic en el botón pasará su valor.

public ActionResult Index(string submit)
{
    Response.Write(submit);
    return View();
}

Por supuesto, puede determinar que el 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();
}

Otros consejos

<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
    }
}

Esto es una respuesta mejor, por lo que puede tener tanto texto como valor para un botón:

http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form.aspx

</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 pocas palabras es un botón ENVIAR, pero que elija el nombre usando el atributo de nombre, es incluso más potente debido a su no obligado a enviar el nombre o el botón en los parámetros del método controlador, se le puede llamar como quiera ...

se puede identificar con el botón de allí etiqueta con su nombre como el de abajo, Es necesario comprobar como este en que el controlador

if (Request.Form["submit"] != null)
{
//Write your code here
}
else if (Request.Form["process"] != null)
{
//Write your code here
}

Esta es una forma muy agradable y sencilla de hacerlo con muy fácil de seguir las instrucciones de uso de una costumbre MultiButtonAttribute:

http: / /blog.maartenballiauw.be/post/2009/11/26/Supporting-multiple-submit-buttons-on-an-ASPNET-MVC-view.aspx

Para resumir, hacer su botones de envío de esta manera:

<input type="submit" value="Cancel" name="action" />
<input type="submit" value="Create" name="action" /> 

Sus 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 crear 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;
    }
}
// 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 que sea más fácil me dirá usted puede cambiar los 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
}

Este post no va a responder a Coppermill, porque han sido contestadas hace mucho tiempo. Mi post va a ser útil para que la búsqueda de solución como esta. En primer lugar, tengo que decir "La solución de WDuffy es totalmente correcto" y trabaja muy bien, pero mi solución (en realidad no la mía) se utilizará en otros elementos y hace que la capa de presentación más independiente del controlador (debido a su controlador depende de "valor" que se utiliza para mostrar la etiqueta del botón, esta característica es importante para otros idiomas.).

Aquí está mi solución, les dan nombres diferentes:

<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, sólo uno de los argumentos tendrán valor. Creo que esto será útil para otros.

Actualizar

Esta respuesta es bastante antiguo y que en realidad reconsiderar mi opinión. tal vez por encima de solución es buena para la situación que pasa parámetro a las propiedades del modelo. no se moleste a sí mismos y tomar la mejor solución para su proyecto.

Dar el nombre de ambos botones y conseguir el registro del valor de la forma.

<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 centrales 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)
       {
       .......

No se puede encontrar a cabo utilizando Request.Form Collection? Si el proceso se hace clic en el [ "proceso"] request.form no estará vacía

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top