none
recibir diferente clase en el controlador RRS feed

  • Pregunta

  •      

    estoy haciendo un proyecto en MVC 4 y Razor y al momento de recibir los datos en el controlador
    necesito identificar que clase viene del formulario (Pueden ser varios)
    en estos momentos funciona BIEN asi:

            [HttpPost]
            public ActionResult Crear(Formulario13VM formulario, FormCollection form)
            {
                string idFormulario = form["TipoFormulario"].ToString();
                if (ModelState.IsValid)
                {
                    Mapper.CreateMap<Formulario13VM, SOLICITUD>();
                    Mapper.CreateMap<Formulario13VM, FORMULARIO13>();
                    SOLICITUD s = Mapper.Map<Formulario13VM, SOLICITUD>(formulario);
                    FORMULARIO13 f = Mapper.Map<Formulario13VM, FORMULARIO13>(formulario);

                    s.FORMULARIO13.Add(f);
                    db.SOLICITUDs.Add(s);
                    db.SaveChanges();

             }

                return View("Formulario" + idFormulario);
            }

     




    la clase recibida en este ejemplo es "Formulario13VM" y esta funcionando perfecto así...
    el tema es que se puede recibir otra clase llamada "Formulario11MV" u otra "Formulario15MV" etc
    y necesito saber como lo puedo hacer para poder hacerlo de forma automatica...
    espero haberme explicado bien.
    saludos


    • Editado felipe_ceg lunes, 3 de diciembre de 2012 20:27
    lunes, 3 de diciembre de 2012 20:26

Todas las respuestas

  • En mi limitada experiencia diría que no es posible si es que usted está pensando en polimorfismo (donde las posibilidades todas tienen el mismo ancestro).

    Sin embargo estaría interesante sobrecargar la acción Crear.  ¿No ha intentado eso?

    [HttpPost]
    public ActionResult Crear(Formulario13VM formulario, FormCollection form)
    {
        ...
    }
    
    [HttpPost]
    public ActionResult Crear(Formulario11VM formulario, FormCollection form)
    {
        ...
    }
    
    [HttpPost]
    public ActionResult Crear(Formulario15VM formulario, FormCollection form)
    {
        ...
    }
    

    Si eso no funcionara pues entonces no se me ocurre nada más.  Si no funciona así, me atrevería a decir que no es posible.


    Jose R. MCP
    Code Samples

    lunes, 3 de diciembre de 2012 23:13
  • Me temo que no va a funcionar lo que propone WebJose. En MVC no es lícito sobrecargar los métodos de acción cambiando únicamente los tipos de los parámetros, es necesario para poder tener más de una sobrecarga que cada una responda a un verbo http distinto (p.ej. [HttpGet] y [HttpPost]). Como en este caso todas responden a un POST, no se puede aplicar este procedimiento. Aunque el código compilará correctamente, dará un error en tiempo de ejecución.

    Una alternativa sería programarlo manualmente, es decir, tomar el FormCollection dentro del método (o el Request.Form) y examinar algún campo que sea diferente en cada uno de los tipos de formularios que se espera recibir. Con eso, se ejecutaría de forma condicional dentro del código la carga de los diferentes objetos que maneja el programa.

     

    martes, 4 de diciembre de 2012 8:19
  • Otra ocpión es tener varias acciones distintas, cada una con un tipo de datos.

    Si se envía distinta información es porque desde el cliente se debe habilitar/deshabilitar algún campo adicional o algo parecido. Pues bien, por javascript puede cambiarse la dirección de post (atributo action) del formulario para que apunte en cada caso a la acción deseada. No se cuán complejo puede ser eso, dependerá de cada caso concreto.

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    martes, 4 de diciembre de 2012 13:19
  • Ah ok, no sabía eso de una acción por verbo.  Gracias por la aclaración entonces.

    Jose R. MCP
    Code Samples

    martes, 4 de diciembre de 2012 13:32