【问题标题】:Converting HTML.EditorFor into a drop down (html.dropdownfor?)将 HTML.EditorFor 转换为下拉列表 (html.dropdownfor?)
【发布时间】:2012-07-16 02:52:08
【问题描述】:

目前我在这样的默认“创建”视图页面中使用 Html.EditorFor 控件。

 <%: Html.EditorFor(model => model.IsActive) %> 

我想将其转换为带有值的下拉列表,并且仍然绑定到视图中的模型。我的问题有两个。

  1. 如果下拉菜单中只需要 2/3 的值。有没有一种快速的方法可以显式填充 2 或 3 个值?

  2. 如果列表很大,需要来自sql查询,怎么办?

提前感谢您的帮助。

【问题讨论】:

    标签: asp.net-mvc drop-down-menu html-helper editorfor


    【解决方案1】:

    为了生成一个下拉列表,您需要在视图模型上使用 2 个属性:一个用于将选定值绑定到的标量属性和一个包含要在下拉列表中显示的项目的集合属性。

    所以你可以定义一个视图模型:

    public class DropDownListViewModel
    {
        public string SelectedValue { get; set; }
        public IEnumerable<SelectListItem> Items { get; set; }
    }
    

    然后在您的主视图模型上具有这种类型的属性:

    public DropDownListViewModel Foo { get; set; }
    

    现在您可以为这种类型创建一个自定义编辑器模板 (~/Views/Shared/EditorTemplates/DropDownListViewModel.ascx):

    <%@ Control 
        Language="C#" Inherits="System.Web.Mvc.ViewUserControl<DropDownListViewModel>" 
    %>
    <%= Html.DropDownListFor(x => x.SelectedValue, Model.Items) %>
    

    然后在你的主视图中:

    <%= Html.EditorFor(x => x.Foo) %> 
    

    现在剩下的就是让你的控制器动作渲染主视图,用相应的值填充Foo 属性。可以是硬编码的,来自存储库或其他任何东西。没关系。

    另一方面,如果您事先知道这些值,您可以在编辑器模板 (~/Views/Shared/EditorTemplates/YesNoDropDown.ascx) 中对它们进行硬编码:

    <%= Html.DropDownList(
        "", 
        new SelectList(
            new[] 
            { 
                new { Value = "true", Text = "Yes" },
                new { Value = "false", Text = "No" },
            }, 
            "Value", 
            "Text",
            Model
        )
    ) %>
    

    然后:

    <%= Html.EditorFor(x => x.IsActive, "YesNoDropDown") %> 
    

    或通过装饰视图模型上的 IsActive 属性:

    [UIHint("YesNoDropDown")]
    public bool IsActive { get; set; }
    

    然后:

    <%= Html.EditorFor(x => x.IsActive) %> 
    

    【讨论】:

    • 感谢您的解决方案。我在编辑器模板 .ascx 页面中收到标识符预期的异常...在新 [] 附近
    • @ZVenue,这个还有问题吗?
    • 没有更多问题..感谢您的帮助..您在此处修改的解决方案..stackoverflow.com/questions/9568111/…
    • 我注意到当我做这种方法验证失败了。你遇到过同样的问题吗?
    • 我对使用@html.editorFor 和上面给出的答案有点困惑。我的验证失败了,我认为有一个简单的原因,但我只是没有弄清楚。任何建议将不胜感激......
    猜你喜欢
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    相关资源
    最近更新 更多