6

我有两个课程,增值税和产品。产品具有 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)

增值税选择器.cshtml

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

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

4

1 回答 1

7

我会使用强类型视图和视图模型,因为它比 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)

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

于 2011-06-12T20:27:58.583 回答