我正在尝试创建一个编辑器模板,它将为传递的选择列表中的每个值创建一个“引导样式”单选按钮(就像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
类紧密结合,它只是没有任何意义。我想要一个通用的编辑器模板。
答案 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)
简单,传统,强类型。