ASP.NET MVC内置支持DropDownList编辑器模板

时间:2012-07-16 04:43:51

标签: asp.net-mvc

有没有办法说我的视图模型属性应该呈现为DropDownList(这样我可以指定DropDownList个项目)?

我发现了很多自定义实现,但我想应该有一种内置的方法来实现这样一个基本的东西。

更新。我正在使用Html.EditorForModel方法渲染我的模型,我不想使用像Html.DropDownListFor这样的方法

2 个答案:

答案 0 :(得分:14)

没有内置模板可以呈现下拉列表,但Nullable<bool>类型除了呈现Not SetYesNo下拉列表外,我认为不是你在问什么

所以让我们建立一个。与往常一样,我们首先定义视图模型,该模型将表示包含2个属性的下拉列表(一个用于选定值,另一个用于可用值):

public class ItemViewModel
{
    public string SelectedId { get; set; }
    public IEnumerable<SelectListItem> Items { get; set; }
}

然后我们可以使用这个属性的标准视图模型:

public class MyViewModel
{
    public ItemViewModel Item { get; set; }
}

然后是一个将填充视图模型的控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel
        {
            Item = new ItemViewModel
            {
                SelectedId = "2",
                Items = new[]
                {
                    new SelectListItem { Value = "1", Text = "item 1" },
                    new SelectListItem { Value = "2", Text = "item 2" },
                    new SelectListItem { Value = "3", Text = "item 3" },
                }
            }
        };
        return View(model);
    }
}

和相应的视图(~/Views/Home/Index.cshtml):

@model MyViewModel
@using (Html.BeginForm())
{
    @Html.EditorForModel()
}

现在剩下的就是为DropDownViewModel类型(~/Views/Shared/EditorTemplates/DropDownViewModel.cshtml)定义自定义编辑器模板:

@model DropDownViewModel
@Html.DropDownListFor(
    x => x.SelectedId, 
    new SelectList(Model.Items, "Value", "Text", Model.SelectedId)
)

并覆盖Object类型的默认模板,以便允许 Deep Dive ,如Brad Wilson在his blog post中所述。否则,默认情况下,ASP.NET MVC不会递归到模板的复杂子类型。所以我们覆盖~/Views/Shared/EditorTemplates/Object.cshtml

@foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => pm.ShowForEdit && !ViewData.TemplateInfo.Visited(pm))) 
{
    if (prop.HideSurroundingHtml) 
    {
        @Html.Editor(prop.PropertyName)
    } 
    else 
    { 
        <div class="editor-label">
            @(prop.IsRequired ? "*" : "")
            @Html.Label(prop.PropertyName)
        </div>
        <div class="editor-field">
            @Html.Editor(prop.PropertyName)
            @Html.ValidationMessage(prop.PropertyName, "*")
        </div>
    }
}

答案 1 :(得分:1)

您可以使用Html Helper DropDownList来构建下拉列表,但模型对象应该是SelectionListItem的数量。

//on controller
    List<SelectListItem> items = new List<SelectListItem>();
     items.Add(new SelectListItem { Text = "Action", Value = "0"});
     items.Add(new SelectListItem { Text = "Drama", Value = "1" });
     items.Add(new SelectListItem { Text = "Comedy", Value = "2", Selected = true });
     items.Add(new SelectListItem { Text = "Science Fiction", Value = "3" });
     ViewBag.MovieType = items;

//on view

         @Html.DropDownList("MovieType")

如果您不想将Model对象构建为SelectListItem,那么您应该使用DropDownListFor

//you can use DropDownListFor as
 @Html.DropDownListFor(m=>m.Text,m.Value)