Tengo un formulario en ASP.Net y la maquinilla de afeitar.

Necesito tener dos formas de presentación de dicho formulario: uno que pasa a través de la Edit acción, y otro que pasa a través de la Validate acción.

¿Cómo debo hacerlo?

No me importa el uso de JavaScript para esto.

EDICIÓN:

Usando el atributo personalizado me sale este error.

La solicitud actual de la acción ‘Resultados’ en el controlador de tipo ‘InspecoesController’ es ambiguo entre los siguientes métodos de acción:
Sistema.Web.Mvc.ActionResult Validar(System.Collections.Generic.ICollection1[Waveform.IEP.Intus.Server.Web.ViewModels.ResultadoViewModel]) on type Waveform.IEP.Intus.Server.Web.Controllers.InspecoesController
System.Web.Mvc.ActionResult Resultados(System.Collections.Generic.ICollection
1[Waveform.IEP.Intus.Server.Web.ViewModels.ResultadoViewModel]) en el tipo de forma de Onda.IEP.Intus.Servidor.Web.Los controladores.InspecoesController

InformationsquelleAutor Tiago Veloso | 2013-05-10

7 Comentarios

  1. 73

    Que es lo que tenemos en nuestras aplicaciones:

    Atributo

    public class HttpParamActionAttribute : ActionNameSelectorAttribute
    {
        public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
        {
            if (actionName.Equals(methodInfo.Name, StringComparison.InvariantCultureIgnoreCase))
                return true;
    
            var request = controllerContext.RequestContext.HttpContext.Request;
            return request[methodInfo.Name] != null;
        }
    }

    Acciones decoradas con ella:

    
    [HttpParamAction]
    public ActionResult Save(MyModel model)
    {
        //...
    }
    
    [HttpParamAction]
    public ActionResult Publish(MyModel model)
    {
        //...
    }

    HTML/máquina de Afeitar

    @using (@Html.BeginForm())
    {
        <!-- form content here -->
        <input type="submit" name="Save" value="Save" />
        <input type="submit" name="Publish" value="Publish" />
    }

    name atributo de botón de envío debe coincidir con la acción/nombre de método

    De esta manera usted no tiene que codificar las direcciones url en javascript

    • Y -1 para … ?
    • Me gusta tu enfoque. Sin embargo, me parece que no puede conseguir que funcione. Tengo el name atributo del conjunto de botones con el nombre de la acción en el controlador. Tengo la excepción en mi pregunta. (Por CIERTO, yo no downvote usted)
    • Puede usted por favor compruebe que HttpParamActionAttribute.IsValidName() es golpear a todos? Si es así, ¿cuál es el valor de request[methodInfo.Name]?
    • request[methodInfo.Name] "Validar" string
    • ¿Tienes un action valor del atributo establecido para el formulario? @using (Html.BeginForm()) debería ser suficiente. Es extraño porque en el momento de escribir este comentario estoy implementando exactamente lo mismo y funciona
    • He conseguido que funcione, pero ahora la Validar recibe un parámetro null.
    • Conseguí este trabajo. Fue un percance en mi final.
    • Me alegro de que usted lo hizo
    • Gracias! Esto funciona como por arte de magia. La creación de la HttpParamAction es un genio!
    • Gran Trabajo!!!!!
    • Bueno. He cambiado el nombre de la mina como ButtonNameActionAttribute: a continuación, el controlador es un poco más limpia y un toque más evidente.
    • Tengo problemas con esto. Mi excepción: de La petición actual para la acción «Index» en el controlador de tipo ‘SellInstallExceptionsController’ es ambiguo entre los siguientes métodos de acción: Sistema.Web.Mvc.ActionResult Index(Directv.UniqueAllocator.WebUI.Modelos.SellInstallExceptionsModels.IndexViewModel) en el tipo de Directv.UniqueAllocator.WebUI.Los controladores.SellInstallExceptionsController Sistema.Web.Mvc.ActionResult BulkDelete(Int32[]) en el tipo de Directv.UniqueAllocator.WebUI.Los controladores.SellInstallExceptionsController… actionName siempre tiene el valor de «Índice». Es correcto esto?
    • Este enfoque requiere de declaraciones específicas de [HttpGet] y [HttpPost]. En mi caso, la ruta por defecto (/Índice/) estaba recibiendo ambos obtienen & POST, por lo que estaba recibiendo ambigua ruta excepciones después de la aplicación de esta. Una vez que he añadido [HttpGet] la Acción por defecto, esto funcionó como se esperaba.
    • esto es fácil en un apuro, pero causa un montón de problemas cuando usted tiene otros métodos de acción en el mismo controlador. Por no hablar de un contrato implícito entre la vista y el controlador (un gran no-no). He optado por una ligera función JS que cambia la forma de la acción antes de la presentación, como @ŁukaszW.pl a continuación
    • realmente útil código, simple y efectivo, muchas gracias
    • Me gusta este enfoque. Y si desea agregar los atributos de HTML , por ejemplo, para el Bootstrap, manteniendo el comportamiento predeterminado de la sin parámetros Html.BeginForm() puede pasar null para la acción y el controlador. Aquí está un ejemplo: Html.BeginForm(null, null, FormMethod.Post, new { @class = "form-horizontal", role = "form" })
    • como dijeron antes, la gran solución! No se de que funciona, pero también es un acercamiento inteligente y me gusta mucho. No puedo creer que usted recibió un -1, a mí me pasa como bien todos saben y, a continuación, – probablemente hay algunos hatters en TAN. Voto a favor de mí! 🙂

  2. 44

    Se puede hacer con jquery, sólo hay que poner dos métodos para enviar para diferentes direcciones url, por ejemplo con este formulario:

    <form id="myForm">
        <%-- form data inputs here ---%>
        <button id="edit">Edit</button>
        <button id="validate">Validate</button>
    </form>

    puede utilizar esta secuencia de comandos (asegúrese de que se encuentra en la Vista, con el fin de utilizar la dirección Url.El atributo de acción):

    <script type="text/javascript">
          $("#edit").click(function() {
              var form = $("form#myForm");
              form.attr("action", "@Url.Action("Edit","MyController")");
              form.submit();
          });
    
          $("#validate").click(function() {
              var form = $("form#myForm");
              form.attr("action", "@Url.Action("Validate","MyController")");
              form.submit();
          });
    </script>
    • Yo no sabía acerca de form.attr(). Esto debe hacer el truco. Gracias.
    • Con javascript/jquery puede manipular cualquier dom propiedad, especialmente los atributos de los elementos con attr(). Si usted no está seguro de si hay un método que necesita el uso de jquery documentación (docs.jquery.com) – hay un montón de conocimiento..
    • Usted debe utilizar el #edit sintaxis en lugar de button#edit, asumiendo que no tienen Identificadores duplicados a través de diferentes tipos de elementos (casi la única razón por la que pude ver que se está utilizando). Consultar por ID es mucho más rápido. Si estás usando no-selector de ID en el lado derecho, que iba a estar un poco mejor porque es el pelado de la lista de abajo. Pero debido a la llanura del selector de ID de usa DOM.getElementById('') (al menos, sin tener que encontrar todos los button elementos), será más rápido.
    • eso no es relacionado con este problema, pero es un buen punto lo he corregido mi respuesta.
    • de acuerdo, no relacionados 🙂 me alegra poder ayudar!
    • Thx. esta es la única solución que el uso de JQuery que puedo encontrar.

  3. 8

    Si usted está trabajando en asp.net con la navaja de afeitar, y desea controlar múltiples botón enviar evento.luego de esta respuesta te guía. Permite, por ejemplo, tenemos dos botones, un botón de redirección que nos «PageA.cshtml» y otros le redirigirá a «PageB.cshtml».

    @{
      if (IsPost)
        {
           if(Request["btn"].Equals("button_A"))
            {
              Response.Redirect("PageA.cshtml");
            }
          if(Request["btn"].Equals("button_B"))
            {
              Response.Redirect("PageB.cshtml");
            }
      }
    }
    <form method="post">
       <input type="submit" value="button_A" name="btn"/>;
       <input type="submit" value="button_B" name="btn"/>;          
    </form>

  4. 5

    Aquí es una buena eplanation:
    ASP.NET MVC – Varios botones en la misma forma

    En 2 palabras:

    usted puede analizar el valor de presentarse en el botón de las palmas de acción

    realizar acciones separadas con su versión de ActionMethodSelectorAttribute (que yo personalmente prefiero y sugieren).

    • Mi respuesta es la versión aprobada del artículo 🙂
    • exactamente, +1
    • Perfecto! Bonito rápido y de fácil aplicación para su uso en lugar de desorden de código en la vista con JQuery/Javascript por CIERTO, para personalizado ActionMethodSelectorAttribute enfoque en el que se pone de esta clase? ¿Es necesario estar registrado en el marco de alguna forma?
  5. 3

    HTML:

    <input type="submit" value="Create" name="button"/>
    <input type="submit" value="Reset" name="button" />

    escribir el siguiente código en el Controlador.

    [HttpPost]
            public ActionResult Login(string button)
            {
                switch (button)
                {
                    case "Create":
                        return RedirectToAction("Deshboard", "Home");
                        break;
                    case "Reset":
                        return RedirectToAction("Login", "Home");
                        break;
                }
    
                return View();
            }
  6. 3

    Con HTML5 puede utilizar botón[formaction]:

    <form action="Edit">
      <button type="submit">Submit</button> <!-- Will post to default action "Edit" -->
      <button type="submit" formaction="Validate">Validate</button> <!-- Will override default action and post to "Validate -->
    </form>
  7. 1

    Podemos tener esto en 2 formas,

    Tener 2 de los envíos dentro de la misma Vista y tener 2 métodos de Acción en el controlador, pero usted tendrá que tener los campos necesarios para presentarse con el formulario para ser colocado dentro de

    ex se da aquí con el código de Múltiples formas de ver asp.net mvc con múltiples botones de envío

    O

    Tienen 2 o varios botones de envío decir btnSubmit1 y btnSubmit2 y verificar el método de Acción que el botón fue pulsado usando el código

    if (Request.Form["btnSubmit1"] != null)
    {
     //
    }
    if (Request.Form["btnSubmit2"] != null)
    {
     //
    }

Dejar respuesta

Please enter your comment!
Please enter your name here