Asp.net mvc 3 如何在MVC3中为复杂类型使用editortemplates?

Asp.net mvc 3 如何在MVC3中为复杂类型使用editortemplates?,asp.net-mvc-3,editortemplates,Asp.net Mvc 3,Editortemplates,我有两个班,增值税和产品。产品具有IVat特性。我试图在MVC中使用编辑器模板来显示创建/编辑产品时所有Vat对象的下拉列表。以我的生命为代价,我不能让它工作 我有下面的代码显示下拉列表,但在提交表单时,它没有设置产品的增值税 控制器: IList<IVatRate> vatRates = SqlDataRepository.VatRates.Data.GetAllResults(); ViewBag.VatRates = new SelectList(vatRates, "Id",

我有两个班,增值税和产品。产品具有IVat特性。我试图在MVC中使用编辑器模板来显示创建/编辑产品时所有Vat对象的下拉列表。以我的生命为代价,我不能让它工作

我有下面的代码显示下拉列表,但在提交表单时,它没有设置产品的增值税

控制器:

IList<IVatRate> vatRates = SqlDataRepository.VatRates.Data.GetAllResults();
ViewBag.VatRates = new SelectList(vatRates, "Id", "Description");
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
        ...
    }
}
VatSelector.cshtml

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

如果有人能对这一点有所了解,甚至能给我指一个在网上某处的好例子,我将不胜感激……我已经被这个问题困扰了好几天了。

我会使用强类型视图和视图模型,因为它使事情比ViewBag简单得多

因此,从视图模型开始:

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

然后,每当您在某处拥有类型为
VatRateViewModel
的属性时,您可以简单地:

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

这将呈现相应的编辑器模板。

谢谢您的回答。editortemplate是否有单独的控制器?如果没有,那么我的产品的值将如何设置?如果设置了,它将去哪里?它应该被称为什么?我以前试过这个,但没能成功。好吧,后来我流了很多血、汗水和眼泪,终于把它解决了。我必须将所有复杂类型以及产品添加到ViewModel中。再次感谢!
@model VatRateViewModel
@using (Html.BeginForm())
{
    @Html.DropDownListFor(
        x => x.SelectedVatRateId,
        new SelectList(Model.Rates, "Id", "Description")
    )
    <input type="submit" value="OK" />
}
@model VatRateViewModel
@Html.DropDownListFor(
    x => x.SelectedVatRateId,
    new SelectList(Model.Rates, "Id", "Description")
)
@Html.EditorFor(x => x.SomePropertyOfTypeVatRateViewModel)