2011-06-12 20 views
6

Tengo dos clases, IVA y Producto. El producto tiene una propiedad de IVat. Estoy tratando de usar plantillas de editor en MVC para mostrar una lista desplegable de todos los objetos Vat al crear/editar un Producto. Para mi querida vida, no puedo hacer que esto funcione.¿Cómo uso editortemplates en MVC3 para tipos complejos?

Tengo el siguiente código que muestra el menú desplegable pero no establece el IVA para el producto cuando se envía el formulario.

controlador:

IList<IVatRate> vatRates = SqlDataRepository.VatRates.Data.GetAllResults(); 
ViewBag.VatRates = new SelectList(vatRates, "Id", "Description"); 

Add.cshtml

@Html.EditorFor(model => model.VatRate.Id, "VatSelector", (SelectList)ViewBag.VatRates) 

VatSelector.cshtml

@model SelectList 
@Html.DropDownList(
     String.Empty /* */, 
      (SelectList)ViewBag.Suppliers, 
     Model 
    ) 

Le agradecería si alguien puede arrojar algo de luz sobre este o incluso que me señale un buen ejemplo en la web en algún lugar ... He estado atrapado con esto por unos días.

Respuesta

7

Usaría vistas fuertemente tipadas y vería modelos, ya que hace las cosas mucho más fáciles en lugar de ViewBag.

Así que empieza con un modelo de vista:

public class VatRateViewModel 
{ 
    public string SelectedVatRateId { get; set; } 
    public IEnumerable<IVatRate> Rates { get; set; } 
} 

luego de un controlador:

public class HomeController: Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new VatRateViewModel 
     { 
      Rates = SqlDataRepository.VatRates.Data.GetAllResults() 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(VatRateViewModel model) 
    { 
     // model.SelectedVatRateId will contain the selected vat rate id 
     ... 
    } 
} 

Vista:

@model VatRateViewModel 
@using (Html.BeginForm()) 
{ 
    @Html.DropDownListFor(
     x => x.SelectedVatRateId, 
     new SelectList(Model.Rates, "Id", "Description") 
    ) 
    <input type="submit" value="OK" /> 
} 

Y si quieres usar editor de plantillas para el VatRateViewModel se podría definir uno en ~/Views/Shared/EditorTemplates/VatRateViewModel.cshtml:

@model VatRateViewModel 
@Html.DropDownListFor(
    x => x.SelectedVatRateId, 
    new SelectList(Model.Rates, "Id", "Description") 
) 

y luego cada vez que en algún lugar que tiene una propiedad de tipo VatRateViewModel usted podría simplemente:

@Html.EditorFor(x => x.SomePropertyOfTypeVatRateViewModel) 

que haría la plantilla de editor correspondiente.

+0

Gracias por la respuesta. ¿El editortemplate tiene un controlador por separado? Si no es así, ¿cómo se establecerán los valores de mi Producto, y si lo hace, a dónde va y cómo debería llamarse? Intenté esto antes y no pude hacerlo funcionar. – Pieter

+0

Ok, MUCHA sangre, sudor y lágrimas más tarde FINALMENTE lo ordené. Tuve que agregar todos mis tipos complejos al ViewModel, así como a mi producto. ¡Gracias de nuevo! – Pieter

Cuestiones relacionadas