454 votos

¿Cómo maneja varios botones de envío en ASP.NET MVC Framework?

¿Hay alguna manera fácil de manejar múltiples botones de envío de la misma forma? Ejemplo:

<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<input type="submit" value="Send" />
<input type="submit" value="Cancel" />
<% Html.EndForm(); %>

¿Alguna idea de cómo hacer esto en ASP.NET Framework Beta? Todos los ejemplos que he buscado en Google para tienen botones solos en ellos.

370voto

Dylan Beattie Puntos 23222

Dar a sus botones de envío de un nombre y, a continuación, inspeccione el valor enviado en su método de controlador:

<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<input type="submit" name="submitButton" value="Send" />
<input type="submit" name="submitButton" value="Cancel" />
<% Html.EndForm(); %>

la publicación de a

public class MyController : Controller {
    public ActionResult MyAction(string submitButton) {
        switch(submitButton) {
            case "Send":
                // delegate sending to another controller action
                return(Send());
            case "Cancel":
                // call another action to perform the cancellation
                return(Cancel());
            default:
                // If they've submitted the form without a submitButton, 
                // just return the view again.
                return(View());
        }
    }

    private ActionResult Cancel() {
        // process the cancellation request here.
        return(View("Cancelled"));
    }

    private ActionResult Send() {
        // perform the actual send operation here.
        return(View("SendConfirmed"));
    }

}

EDICIÓN:

Para ampliar este enfoque para trabajar con sitios localizados, aislar sus mensajes algún otro lugar (por ej. la compilación de un archivo de recursos para un establecimiento inflexible de tipos de recursos de clase)

A continuación, modifique el código para que obras como:

<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<input type="submit" name="submitButton" value="<%= Html.Encode(Resources.Messages.Send)%>" />
<input type="submit" name="submitButton" value="<%=Html.Encode(Resources.Messages.Cancel)%>" />
<% Html.EndForm(); %>

y el controlador debe tener este aspecto:

// Note that the localized resources aren't constants, so 
// we can't use a switch statement.

if (submitButton == Resources.Messages.Send) { 
    // delegate sending to another controller action
    return(Send());

} else if (submitButton == Resources.Messages.Cancel) {
     // call another action to perform the cancellation
     return(Cancel());
}

322voto

mkozicki Puntos 1668

Aquí es una solución basada en atributos sobre todo limpia a la cuestión de botón enviar múltiples basada fuertemente en el post y los comentarios de Maartin Balliauw.

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class MultipleButtonAttribute : ActionNameSelectorAttribute
{
    public string Name { get; set; }
    public string Argument { get; set; }

    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
    {
        var isValidName = false;
        var keyValue = string.Format("{0}:{1}", Name, Argument);
        var value = controllerContext.Controller.ValueProvider.GetValue(keyValue);

        if (value != null)
        {
            controllerContext.Controller.ControllerContext.RouteData.Values[Name] = Argument;
            isValidName = true;
        }

        return isValidName;
    }
}

maquinilla de afeitar:

<form action="" method="post">
 <input type="submit" value="Save" name="action:Save" />
 <input type="submit" value="Cancel" name="action:Cancel" />
</form>

y el controlador:

[HttpPost]
[MultipleButton(Name = "action", Argument = "Save")]
public ActionResult Save(MessageModel mm) { ... }

[HttpPost]
[MultipleButton(Name = "action", Argument = "Cancel")]
public ActionResult Cancel(MessageModel mm) { ... }

102voto

Trevor de Koekkoek Puntos 2029

Puede comprobar el nombre de la acción como se ha mencionado, pero usted podría considerar la posibilidad de si este es o no es un buen diseño. Es una buena idea considerar la responsabilidad de la acción y no la pareja de este diseño demasiado a la interfaz de usuario de aspectos como los nombres de los botones. Para considerar el uso de las 2 formas y 2 acciones:

<% Html.BeginForm("Send", "MyController", FormMethod.Post); %>
<input type="submit" name="button" value="Send" />
<% Html.EndForm(); %>

<% Html.BeginForm("Cancel", "MyController", FormMethod.Post); %>
<input type="submit" name="button" value="Cancel" />
<% Html.EndForm(); %>

También, en el caso de "Cancelar", que por lo general no sólo de procesar el formulario y se va a una nueva URL. En este caso, usted no necesita presentar el formulario en todos y necesita un link:

<%=Html.ActionLink("Cancel", "List", "MyController") %>

81voto

PabloBlamirez Puntos 969

Eilon sugiere que usted puede hacer algo como esto:

Si usted tiene más de un botón, usted se puede distinguir entre ellos, dando cada botón de un nombre:

<input type="submit" name="SaveButton" value="Save data" />
<input type="submit" name="CancelButton" value="Cancel and go back to main page" />

En su método de acción del controlador que puede añadir parámetros nombrado después de que el HTML de la etiqueta de entrada los nombres de:

public ActionResult DoSomeStuff(string saveButton, string
cancelButton, ... other parameters ...)
{ ... }

Si cualquier valor que se envía a uno de esos parámetros, lo que significa que el botón fue la que se hizo clic. El navegador web sólo registrará un valor para un botón que consiguió hacer clic. Todos los demás valores, será nula.

if (saveButton != null) { /* do save logic */ }
if (cancelButton != null) { /* do cancel logic */ }

Me gusta este método, ya que no se basan en el valor de la propiedad de los botones de envío que es más probable que a cambio de la asignación de nombres y no requiere javascript para estar habilitado

Ver: http://forums.asp.net/p/1369617/2865166 .aspx#2865166

31voto

Izmoto Puntos 1134

Yo sugeriría interesados echa un vistazo a una solución, creo que es muy elegante aquí >> http://blog.maartenballiauw.be/post/2009/11/26/Supporting-multiple-submit-buttons-on-an-ASPNET-MVC-view.aspx

En el caso de su utilizando el atributo funcionen aplicado a una acción de controlador para indicar qué botón haga clic en el enlace desaparece esa acción debe relacionarse.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: