将HTML.EditorFor转换为下拉列表(html.dropdownfor?)

15

目前我在默认的“创建”视图页面中使用Html.EditorFor控件,如下所示。

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

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

  1. 如果在下拉列表中只需要2/3个值..是否有一种快速的方法来显式地填充2或3个值?

  2. 如果列表很大并且需要从SQL查询中获取,该怎么做?

先感谢您的帮助。

1个回答

36
为了生成一个下拉列表,你需要在你的视图模型上拥有两个属性:一个标量属性来绑定选定的值,一个集合属性包含要显示在下拉列表中的项目。
因此,你可以定义一个视图模型:
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 页面中,我遇到了一个预期标识符异常...靠近 new[]。 - ZVenue
@ZVenue,这个还有问题吗? - Darin Dimitrov
没有更多的问题了,感谢您的帮助。这是您修改后的解决方案:http://stackoverflow.com/questions/9568111/problems-converting-editorfor-to-dropdownlist - ZVenue
我注意到当我采用这种方法时,验证出现了问题。你有同样的问题吗? - Warren LaFrance
我对使用@html.editorFor和上面给出的答案有点困惑。我的验证失败了,我觉得这里一定有一个简单的原因,但我就是想不出来。任何建议都将不胜感激... - Warren LaFrance
我有点早已知道这一点,但这样清晰简明地呈现出来还是很有帮助的。谢谢,Darin。 - Martin Hansen Lennox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接