如何在编辑器模板中使用传递的选择列表

时间:2013-02-25 13:04:13

标签: asp.net-mvc asp.net-mvc-3 mvc-editor-templates

我正在尝试创建一个编辑器模板,它将为传递的选择列表中的每个值创建一个“引导样式”单选按钮(就像Html.DropDownFor方法创建一个下拉列表一样)

所以我接到了我的看法:

@Html.EditorFor(model => model.FaultTypeID,"RadioButtonList", 
        new SelectList(Model.AllowdeFaultTypes, "FaultTypeID", "FaultTypeName"))

现在是RadioButtonList的模板:

@foreach (var item in ViewData["Items"] as SelectList)
{
    <a>@item.Text</a> <b>@item.Value</b>
}

但转换失败,我得到NullReferanceExeption。 通过反思,我发现ViewData["Items"]值的类型为System.Collections.Generic.List<CamelotFaultManagement.DAL.FaultType>

问题是我真的不想将RadioButtonList编辑器模板与CamelotFaultManagement.DAL.FaultType类紧密结合,它只是没有任何意义。我想要一个通用的编辑器模板。

1 个答案:

答案 0 :(得分:6)

在您的编辑器模板中,您似乎使用了一些您从未设置的ViewData["Items"]属性。如果您想使用此类属性,请确保已分配它:

@Html.EditorFor(
    model => model.FaultTypeID,
    "RadioButtonList", 
    new { Items = new SelectList(Model.AllowdeFaultTypes, "FaultTypeID", "FaultTypeName") }
)

话虽这么说,你使用一些ViewData的方法对我来说似乎完全没错。

我只想定义一个视图模型(就像在ASP.NET MVC中一样):

public class RadioListViewModel
{
    public string Value { get; set; }
    public IEnumerable<SelectListItem> Values { get; set; }
}

然后您可以将您的编辑器模板强类型化为此视图模型。当然,您的编辑器模板现在将存储在~/Views/Shared/EditorTemplates/RadioListViewModel.cshtml

@model IRadioListViewModel
@foreach (var item in Model)
{
    <a>@item.Text</a> <b>@item.Value</b>
}

现在剩下的就是在主视图模型中使用此视图模型:

public class MyViewModel
{
    public RadioListViewModel FaultTypes { get; set; }
    ...
}

然后在视图中只显示相应的编辑器模板:

@model MyViewModel
...
@Html.EditorFor(x => x.FaultTypes)

简单,传统,强类型。