How do I use editortemplates in MVC3 for complex types?

人走茶凉 提交于 2019-12-04 23:35:56

问题


I have two classes, Vat and Product. Product has a property of IVat. I am trying to use editor templates in MVC to display a dropdown list of all the Vat objects when creating/editing a Product. For the dear life of me I cannot get this working.

I have the following code which displays the dropdown but it does not set the Vat for the Product when the form gets submitted.

Controller:

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
    )

I would be grateful if anyone can shed some light on this or even point me to a good example on the web somewhere...I have been stuck with this for quite a few days now.


回答1:


I would use strongly typed views and view models as it makes things so much easier rather than ViewBag.

So start with a view model:

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

then a controller:

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
        ...
    }
}

View:

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

And if you wanted to use editor template for the VatRateViewModel you could define one in ~/Views/Shared/EditorTemplates/VatRateViewModel.cshtml:

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

and then whenever somewhere you have a property of type VatRateViewModel you could simply:

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

which would render the corresponding editor template.



来源:https://stackoverflow.com/questions/6324102/how-do-i-use-editortemplates-in-mvc3-for-complex-types

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!