Pregunta

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 del IVA al crear/editar un producto. Por la querida vida de mí, no puedo hacer que esto funcione.

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
    )

Estaría agradecido si alguien pueda arrojar algo de luz sobre esto o incluso señalarme un buen ejemplo en la web en alguna parte ... He estado atrapado con esto durante bastantes días.

¿Fue útil?

Solución

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

Así que comience con un modelo de vista:

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

Entonces 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 quisiera usar la plantilla de editor para el VatrateViewModel, podría definir una en ~/Views/Shared/EditorTemplates/VatRateViewModel.cshtml:

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

y luego, cuando sea que tenga una propiedad de tipo VatRateViewModel Podrías simplemente:

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

que representaría la plantilla del editor correspondiente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top