3

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

4

1 回答 1

7

在您的编辑器模板中,您似乎使用了一些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)

简单、传统、强类型。

于 2013-02-25T13:12:09.630 回答