¿Hay alguna manera fácil de manejar múltiples botones de envío desde el mismo formulario? Por 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 busqué en Google tienen botones únicos en ellos.
c#
html
asp.net-mvc
http-post
form-submit
Spoike
fuente
fuente
Respuestas:
Aquí hay una solución basada en atributos en su mayoría limpia para el problema del botón de envío múltiple basado en gran medida en la publicación y los comentarios de Maarten Balliauw .
maquinilla de afeitar:
y controlador:
Actualización: las páginas de Razor parecen proporcionar la misma funcionalidad fuera de la caja. Para un nuevo desarrollo, puede ser preferible.
fuente
return View(viewmodel)
en el caso de que su modelo tenga errores, intentará devolver una vista llamadaSend
o en función del nombre de su argumento.return View("Index", viewModel)
Dé un nombre a sus botones de envío y luego inspeccione el valor enviado en su método de controlador:
publicar en
EDITAR:
Para extender este enfoque para trabajar con sitios localizados, aísle sus mensajes en otro lugar (por ejemplo, compilando un archivo de recursos en una clase de recursos fuertemente tipada)
Luego modifique el código para que funcione como:
y su controlador debería verse así:
fuente
Puede verificar el nombre en la acción como se ha mencionado, pero puede considerar si este es un buen diseño o no. Es una buena idea considerar la responsabilidad de la acción y no acoplar demasiado este diseño a los aspectos de la interfaz de usuario, como los nombres de los botones. Entonces considere usar 2 formas y 2 acciones:
Además, en el caso de "Cancelar", generalmente no está procesando el formulario y va a una nueva URL. En este caso, no es necesario que envíe el formulario y solo necesita un enlace:
fuente
Eilon sugiere que puedes hacerlo así:
Me gusta este método, ya que no se basa en la propiedad de valor de los botones de envío, que es más probable que cambie que los nombres asignados y no requiere que JavaScript esté habilitado
Ver: http://forums.asp.net/p/1369617/2865166.aspx#2865166
fuente
Acabo de escribir una publicación sobre eso: Múltiples botones de envío con ASP.NET MVC :
Básicamente, en lugar de usar
ActionMethodSelectorAttribute
, estoy usandoActionNameSelectorAttribute
, lo que me permite fingir que el nombre de la acción es lo que quiero que sea. Afortunadamente,ActionNameSelectorAttribute
no solo me hace especificar el nombre de la acción, sino que puedo elegir si la acción actual coincide con la solicitud.Así que ahí está mi clase (por cierto, no me gusta demasiado el nombre):
Para usar solo defina una forma como esta:
y controlador con dos métodos
Como puede ver, el atributo no requiere que especifique nada en absoluto. Además, el nombre de los botones se traduce directamente a los nombres de los métodos. Además (no lo he intentado), estas también deberían funcionar como acciones normales, por lo que puede publicar en cualquiera de ellas directamente.
fuente
submit
etiqueta de la consideración, lo cual es ideal ya que es un atributo de interfaz de usuario puro que no debería tener ninguna relación con el flujo de control. En cambio, elname
atributo único de cadasubmit
etiqueta se traduce directamente en un método de acción discreto en su controlador.es corto y suite:
y hacer esto en código behinde
Buena suerte.
fuente
Sugeriría a las partes interesadas que echen un vistazo a la solución de Maarten Balliauw . Creo que es muy elegante.
En caso de que el enlace desaparezca, está usando el
MultiButton
atributo aplicado a una acción del controlador para indicar a qué botón hacer clic esa acción debería relacionarse.fuente
Debería poder nombrar los botones y darles un valor; luego asigne este nombre como argumento a la acción. Alternativamente, use 2 enlaces de acción separados o 2 formas.
fuente
Podrías escribir:
Y luego, en la página, verifique si el nombre == "Enviar" o el nombre == "Cancelar" ...
fuente
Algo que no me gusta de ActionSelectName es que se llama a IsValidName para cada método de acción en el controlador; No sé por qué funciona de esta manera. Me gusta una solución donde cada botón tiene un nombre diferente en función de lo que hace, pero no me gusta el hecho de que tenga que tener tantos parámetros en el método de acción como botones en el formulario. He creado una enumeración para todos los tipos de botones:
En lugar de ActionSelectName, uso un ActionFilter:
El filtro encontrará el nombre del botón en los datos del formulario y si el nombre del botón coincide con alguno de los tipos de botón definidos en la enumeración, encontrará el parámetro ButtonType entre los parámetros de acción:
y luego en vistas, puedo usar:
fuente
Esto es lo que funciona mejor para mí:
fuente
También me encontré con este 'problema' pero encontré una solución bastante lógica al agregar el
name
atributo. No recuerdo haber tenido este problema en otros idiomas.http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2
Lo que significa que los siguientes
value
atributos de código pueden cambiarse, localizarse, internacionalizarse sin la necesidad de código adicional que verifique los archivos o constantes de recursos fuertemente tipados.En el extremo receptor solo necesitaría verificar si alguno de sus tipos de envío conocidos no es
null
fuente
Si no tiene restricciones en el uso de HTML 5, puede usar la
<button>
etiqueta conformaction
Atributo:Referencia: http://www.w3schools.com/html5/att_button_formaction.asp
fuente
Si su navegador admite la formación de atributos para los botones de entrada (IE 10+, no estoy seguro acerca de otros navegadores), entonces lo siguiente debería funcionar:
fuente
Hay tres formas de resolver el problema anterior.
A continuación se muestra un video que resume los tres enfoques de manera demostrativa.
https://www.facebook.com/shivprasad.koirala/videos/vb.100002224977742/809335512483940
Forma HTML: -
En la forma HTML, necesitamos crear dos formularios y colocar el botón "Enviar" dentro de cada uno de los formularios. Y la acción de cada formulario apuntará a acciones diferentes / respectivas. Puede ver el siguiente código: el primer formulario se publica en "Acción1" y el segundo formulario se publicará en "Acción2", según el botón "Enviar" que se haga clic.
Forma Ajax: -
En caso de que seas un amante del Ajax, esta segunda opción te entusiasmaría más. En la forma Ajax podemos crear dos funciones diferentes "Fun1" y "Fun1", vea el siguiente código. Estas funciones harán llamadas Ajax utilizando JQUERY o cualquier otro marco. Cada una de estas funciones se vincula con los eventos "OnClick" del botón "Enviar". Cada una de estas funciones realiza llamadas a los respectivos nombres de acción.
Usando "ActionNameSelectorAttribute": -
Esta es una excelente y limpia opción. El "ActionNameSelectorAttribute" es una clase de atributo simple donde podemos escribir la lógica de toma de decisiones que decidirá qué acción se puede ejecutar.
Entonces, lo primero es en HTML, necesitamos poner nombres propios a los botones de envío para identificarlos en el servidor.
Puede ver que hemos puesto "Guardar" y "Eliminar" a los nombres de los botones. También puede notar en la acción que acabamos de poner el nombre del controlador "Cliente" y no un nombre de acción en particular. Esperamos que el nombre de la acción se decida por "ActionNameSelectorAttribute".
Entonces, cuando se hace clic en el botón de envío, primero toca el atributo "ActionNameSelector" y luego, dependiendo de qué envío se activa, invoca la acción apropiada.
Entonces, el primer paso es crear una clase que herede de la clase "ActionNameSelectorAttribute". En esta clase hemos creado una propiedad simple "Nombre".
También necesitamos anular la función "IsValidName" que devuelve verdadero o flase. Esta función es donde escribimos la lógica de si una acción tiene que ejecutarse o no. Entonces, si esta función devuelve verdadero, entonces la acción se ejecuta o no.
El corazón principal de la función anterior está en el siguiente código. La colección "ValueProvider" tiene todos los datos que se han publicado desde el formulario. Por lo tanto, primero busca el valor "Nombre" y, si se encuentra en la solicitud HTTP, devuelve verdadero o, de lo contrario, devuelve falso.
Esta clase de atributo se puede decorar en la acción respectiva y se puede proporcionar el valor de "Nombre" respectivo. Entonces, si el envío está presionando esta acción y si el nombre coincide con el nombre del botón de envío HTML, entonces ejecuta la acción más o no lo hace.
fuente
David Findley escribe sobre 3 opciones diferentes que tiene para hacer esto, en su weblog ASP.Net.
Lea el artículo de varios botones en la misma forma para ver sus soluciones y las ventajas y desventajas de cada uno. En mi humilde opinión, proporciona una solución muy elegante que hace uso de los atributos con los que decoras tu acción.
fuente
Esta es la técnica que usaría y todavía no la veo aquí. El enlace (publicado por Saajid Ismail) que inspira esta solución es http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form .aspx ). Adapta la respuesta de Dylan Beattie para hacer la localización sin ningún problema.
En la vista:
En el controlador:
fuente
<input>
elementos. Yo uso<button>
, que se requiere para hacer la localización sin tener atributos de valor variable.Este script permite especificar un atributo de acción de formulario de datos que funcionará como el atributo de formación de HTML5 en todos los navegadores (de una manera discreta):
El formulario que contiene el botón se publicará en la URL especificada en el atributo data-form-action:
Esto requiere jQuery 1.7. Para versiones anteriores debe usar en
live()
lugar deon()
.fuente
Aquí hay un método de extensión que escribí para manejar múltiples botones de imagen y / o texto.
Aquí está el HTML para un botón de imagen:
o para un botón de enviar texto:
Aquí está el método de extensión con el que llama desde el controlador
form.GetSubmitButtonName()
. Para los botones de imagen, busca un parámetro de formulario con.x
(que indica que se hizo clic en un botón de imagen) y extrae el nombre. Para losinput
botones normales , busca un nombre que comienceSubmit_
y extrae el comando de más adelante. Como estoy abstrayendo la lógica de determinar el 'comando', puede cambiar entre los botones de imagen + texto en el cliente sin cambiar el código del lado del servidor.Nota: Para los botones de texto, debe prefijar el nombre con
Submit_
. Prefiero esta forma porque significa que puede cambiar el valor del texto (visualización) sin tener que cambiar el código. A diferencia de losSELECT
elementos, unINPUT
botón solo tiene un 'valor' y ningún atributo de 'texto' separado. Mis botones dicen cosas diferentes en contextos diferentes, pero se asignan al mismo 'comando'. Prefiero extraer el nombre de esta manera que tener que codificar== "Add to cart"
.fuente
No tengo suficiente representante para comentar en el lugar correcto, pero pasé todo el día en esto, así que quiero compartir.
Al intentar implementar la solución "MultipleButtonAttribute",
ValueProvider.GetValue(keyValue)
volvería incorrectamentenull
.Resultó que estaba haciendo referencia a System.Web.MVC versión 3.0 cuando debería haber sido 4.0 (otros ensamblados son 4.0). No sé por qué mi proyecto no se actualizó correctamente y no tuve otros problemas obvios.
Entonces, si su
ActionNameSelectorAttribute
no funciona ... verifique eso.fuente
Llego bastante tarde a la fiesta, pero aquí va ... Mi implementación toma prestada de @mkozicki pero requiere menos cadenas codificadas para equivocarse. Se requiere Framework 4.5+ . Básicamente, el nombre del método del controlador debe ser la clave del enrutamiento.
Marcado . El nombre del botón debe estar tecleado con
"action:[controllerMethodName]"
(nótese el uso del C # 6 nombredel API, proporcionando referencia de tipo-específica al nombre del método controlador que desea invocar.
Controlador :
Atributo Magia . Note el uso de la
CallerMemberName
bondad.fuente
fuente
Intenté hacer una síntesis de todas las soluciones y creé un atributo [ButtenHandler] que facilita el manejo de múltiples botones en un formulario.
Lo describí en CodeProject Botones de formulario parametrizados múltiples (localizables) en ASP.NET MVC .
Para manejar el caso simple de este botón:
Tendrá algo como el siguiente método de acción:
Observe cómo el nombre del botón coincide con el nombre del método de acción. El artículo también describe cómo tener botones con valores y botones con índices.
fuente
fuente
Esta es la mejor manera que he encontrado:
http://iwayneo.blogspot.co.uk/2013/10/aspnet-mvc-action-selector-with-list.html
Aquí está el código:
Disfrute de un botón de envío múltiple sin código de olor en el futuro.
gracias
fuente
Versión modificada del
HttpParamActionAttribute
método pero con una corrección de errores para no causar un error en las devoluciones de sesión caducadas / no válidas. Para ver si esto es un problema con su sitio actual, abra el formulario en una ventana y justo antes de hacer clicSave
oPublish
, abra una ventana duplicada y cierre la sesión. Ahora regrese a su primera ventana e intente enviar su formulario con cualquiera de los botones. En mi caso, recibí un error, por lo que este cambio me soluciona el problema. Omito un montón de cosas por razones de brevedad, pero deberías tener la idea. Las partes clave son la inclusiónActionName
en el atributo y asegurarse de que el nombre pasado sea el nombre de la Vista que muestra el formularioClase de atributo
Controlador
Ver
fuente
Mi enfoque JQuery usando un método de extensión:
Puedes usarlo así:
Y se presenta así:
fuente
Para cada botón de enviar simplemente agregue:
fuente
Basado en la respuesta de mkozicki, llego a una solución un poco diferente. Todavía uso
ActionNameSelectorAttribute
Pero necesitaba manejar dos botones 'Guardar' y 'Sincronizar'. Hacen casi lo mismo, así que no quería tener dos acciones.atributo :
ver
controlador
También quiero señalar que si las acciones hacen cosas diferentes, probablemente seguiría la publicación de mkozicki.
fuente
He creado un método ActionButton para HtmlHelper . Generará un botón de entrada normal con un poco de javascript en el evento OnClick que enviará el formulario al Controlador / Acción especificado.
Usas el ayudante así
esto generará el siguiente HTML
Aquí está el código del método de extensión:
VB.Net
C # (el código C # se acaba de descompilar de la DLL de VB, por lo que puede obtener algo de embellecimiento ... pero el tiempo es muy corto :-))
Estos métodos tienen varios parámetros, pero para facilitar su uso, puede crear una sobrecarga que tome solo los parámetros que necesita.
fuente