【问题标题】:How to use passed select list in an editor template如何在编辑器模板中使用传递的选择列表
【发布时间】:2013-02-25 21:12:09
【问题描述】:

我正在尝试创建一个编辑器模板,该模板将为传递的选择列表中的每个值创建一个“引导样式”单选按钮(就像 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&lt;CamelotFaultManagement.DAL.FaultType&gt;

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

【问题讨论】:

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


    【解决方案1】:

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

    简单、传统、强类型。

    【讨论】:

    • 天哪!我以为我通过了..必须创建一个匿名对象并忘记了!谢谢!
    • 在进入混乱的 ViewData 之前,请阅读我推荐的方法。
    • 我对您的建议有疑问,因为我正在尝试为整数类型的 TypeID 创建一个编辑器,我希望有一组封闭的类型供用户选择我不知道如何使用 RadioListViewModel 的编辑器为 TypeID 属性输入值..
    • 如果您想为TypeID 属性创建一个编辑器模板,该属性是一个整数,您不需要在其中添加任何集合。如果你需要它们,那么你做错了,你的编辑器模板没有使用正确的类型,因为你需要额外的信息。这就是视图模型的用武之地。如果你想让它更通用一点,你可以使用对象类型而不是整数。但是您应该考虑统一在整个应用程序中使用的身份类型。可能要避免使用字符串、guid、短整数、长整数、时间戳……。
    • 所以你是说有一个有限的数据库驱动的“TypeID”值列表,它应该是一个列表类型,可以保存所有值和选定的值?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    相关资源
    最近更新 更多