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

ZVe*_*nue 15 asp.net-mvc html-helper editorfor drop-down-menu

目前我在默认的"创建"视图页面中使用Html.EditorFor控件.

 <%: Html.EditorFor(model => model.IsActive) %> 
Run Code Online (Sandbox Code Playgroud)

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

  1. 如果下拉列表中只需要2/3值.是否有快速方法可以明确填充2或3个值?

  2. 如果列表很大并且需要来自sql查询,该怎么做?

在此先感谢您的帮助.

Dar*_*rov 33

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

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

public class DropDownListViewModel
{
    public string SelectedValue { get; set; }
    public IEnumerable<SelectListItem> Items { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

public DropDownListViewModel Foo { get; set; }
Run Code Online (Sandbox Code Playgroud)

现在您可以为此类型(~/Views/Shared/EditorTemplates/DropDownListViewModel.ascx)设置自定义编辑器模板:

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

然后在主视图中:

<%= Html.EditorFor(x => x.Foo) %> 
Run Code Online (Sandbox Code Playgroud)

现在剩下的就是让控制器操作呈现主视图以Foo使用相应的值填充属性.可以硬编码,来自存储库或其他任何东西.这并不重要.

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

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

然后:

<%= Html.EditorFor(x => x.IsActive, "YesNoDropDown") %> 
Run Code Online (Sandbox Code Playgroud)

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

[UIHint("YesNoDropDown")]
public bool IsActive { get; set; }
Run Code Online (Sandbox Code Playgroud)

然后:

<%= Html.EditorFor(x => x.IsActive) %> 
Run Code Online (Sandbox Code Playgroud)