【问题标题】:How do I use editortemplates in MVC3 for complex types?如何在 MVC3 中将编辑器模板用于复杂类型?
【发布时间】:2011-09-13 12:35:28
【问题描述】:

我有两个课程,增值税和产品。产品具有 IVat 属性。我试图在 MVC 中使用编辑器模板在创建/编辑产品时显示所有增值税对象的下拉列表。为了我亲爱的生活,我无法让这个工作。

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

控制器:

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

添加.cshtml

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

VatSelector.cshtml

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

如果有人能对此有所了解,或者甚至指出我在网络上某个地方的一个很好的例子,我将不胜感激......我已经坚持了好几天了。

【问题讨论】:

    标签: asp.net-mvc-3 editortemplates


    【解决方案1】:

    我会使用强类型视图和视图模型,因为它比 ViewBag 更容易。

    所以从一个视图模型开始:

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

    然后是控制器:

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

    查看:

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

    如果您想为 VatRateViewModel 使用编辑器模板,您可以在 ~/Views/Shared/EditorTemplates/VatRateViewModel.cshtml 中定义一个:

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

    然后,只要您在某个地方拥有VatRateViewModel 类型的属性,您就可以简单地:

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

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

    【讨论】:

    • 感谢您的回答。编辑器模板是否有单独的控制器?如果没有,那么我的产品值将如何设置,如果是,它会去哪里以及应该调用什么?我以前试过这个,但无法让它工作。
    • 好吧,我流了很多血、汗和眼泪,我终于把它整理好了。我必须将所有复杂类型添加到 ViewModel 以及我的产品中。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    相关资源
    最近更新 更多