none
Create View with one to many model RRS feed

  • Pregunta

  • Quiero crear una vista donde pueda generar una cotizacion con X servicios y X productos asociados pero no logro obtener la información de los modelos de cotizacion de productos y servicios.

    El problema que en mi HttpPost / ACtionResult no logro obtener datos de los otros modelos.

      public class Cotizaciones
        {
    
            [Key]
            public int CotizacionId { get; set; }
    
    // varios datos mas y el intento de crear el "one to many"
    
            public IEnumerable<CotizacionServicio> CotServicios { get; set; }
            public IEnumerable<CotizacionProducto> CotProducto { get; set; }
    
            public List<CotizacionServicio> CotServicios { get; set; }
            public List<CotizacionProducto> CotProducto { get; set; }
    
    
    }

    Y los modelos de CotizacionProductos y CotizacionServicios

     public class CotizacionServicio
        {
            [Key]
            public Int32 CotServId { get; set; }
    
    // varios campos mas propios del servicios y la clave foranea de la principal que es cotizacion
    
            public int CotizacionId { get; set; }
            [ForeignKey("CotizacionId")]
            public virtual Cotizaciones Cotizacion { get; set; }
    
    }
    
     public class CotizacionProducto
        {
            [Key]
            public int CotProdId { get; set; }
    
    // varios campos mas propios del producto y la clave foranea de la principal que es cotizacion
    
            public int CotizacionId { get; set; }
            [ForeignKey("CotizacionId")]
            public virtual Cotizaciones Cotizacion { get; set; }
    }
    

    La vista Create donde si me aparecen bien los campos al momento de "Get" de la vista.

    @model Scandimex.Models.Cotizaciones @{ ViewBag.Title = "Create"; } <h2>Create a new Quotation</h2> @using (Html.BeginForm()) { @Html.AntiForgeryToken() @Html.ValidationSummary(true) <fieldset> <legend>Cotizaciones</legend> <table> <tr> <td> <div class="editor-label"> @Html.LabelFor(model => model.CodigoInterno) </div> <div class="editor-field"> @Html.EditorFor(model => model.CodigoInterno) @Html.ValidationMessageFor(model => model.CodigoInterno) </div> </td> </table> <div id="Servicios"> <h3>Servicies</h3> <p> <input type="submit" value="Add Servicie" name="AddServicies" /> </p>

    <div id="PartialServicio"> @Html.Partial("/Views/CotizacionServicio/Create.cshtml", model: Model ) </div> </div> <div id="Productos"> <h3>Products</h3> <p> <input type="submit" value="Add Product" name="AddProduct" /> </p> <div id="PartialServicio"> @Html.Partial("/Views/CotizacionProducto/Create.cshtml", model: Model) </div> </div> <p> <input type="submit" value="Create" /> </p> </fieldset> }


    Y el metodo del controlador de cotizacion

       [HttpPost]
            public ActionResult Create(Cotizaciones _cotizacion, FormCollection _Formulario, PartialViewResult _Particiones)
            {
                try
                {
                    if (ModelState.IsValid)
                    {
    
                        _common.bd.Cotizacion.Add(_cotizacion);
                        _common.bd.SaveChanges();
    
                        if (_Particiones.ViewEngineCollection.Count > 0)
                        {
                            foreach (var item in _Particiones.ViewEngineCollection)
                            {
                                switch (item.ToString())
                                {
                                    case "CotizacionProducto":
                                        break;
    
                                    case "CotizacionServicio":
                                        break;
    
                                    default:
                                        //item.FindPartialView( Model )
                                        break;
                                }
                            }
                        }
    
                        return this.RedirectToAction("Index");
                    }
    
                    return View(_cotizacion);
                }
                catch (Exception ex)
                {
                    return this.View("Error", ex);
                }
            }


    Intente obtener datos desde la vista con el objeto cotizacion,FormCollection y PartialViewResult pero no logro obtener los datos de la CotizacionServicio y CotizacionProducto.

    Se que para obtener los datos como objetos "secundarios" tipados desde la vista debería ser

    @Html.Partial("/Views/CotizacionServicio/Create.cshtml", model: Model.CotServicio )

    y no

    @Html.Partial("/Views/CotizacionServicio/Create.cshtml", model: Model)

    Pero al momento de llamar Get de la vista me arroja error diciendo que no puede ser nulo por eso lo deje como model:Model

    Cualquier ayuda u oponiones muchas gracias ya que estoy atrapado intentando solucionar esto de hace varios días leyendo y leyendo sin tener buenos resultados :/

    domingo, 26 de febrero de 2017 4:33

Todas las respuestas

  • hola

    porque en la clase Cotizaciones defienes propiedades repetias con IEnumerable<> y List<> ? o defines con un tipo o con otro no ambos

    >>Intente obtener datos desde la vista con el objeto cotizacion,FormCollection y PartialViewResult pero no logro obtener los datos de la CotizacionServicio y CotizacionProducto.

    Partamos que un parametros PartialViewResult en el action esta mal, ese puede quitarlo

    Para las colecciones de CotServicios y CotProducto no veo que definas ningun foreach en la view que arme una tabla con registros

    si lo defines como partialview no te va a funcionar ya que requieres que el name del elemento html sea representado como una coleccion

    intenta definir la tabla directo en la view para ver si asi lo recibes, no uses ningun partialview

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 27 de febrero de 2017 22:40