2012-07-16 71 views
8

有什么办法可以说我的视图模型属性应该呈现为DropDownList(这样我可以指定DropDownList项)?ASP.NET MVC内置支持DropDownList编辑器模板

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

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

回答

14

使用有没有内置的模板,呈现一个下拉列表中,除了Nullable<bool>类型的呈现Not Set,Yes,No下拉菜单,但我认为这不是你所问的。

所以我们来建造一个。与往常一样,我们首先来定义,将表示含有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) 
) 

和覆盖对象类型的默认模板,以允许深潜正如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

是什么DropDownViewModel控制器,是ItemViewModel? – mmssaann 2013-07-16 05:12:15

+0

这不显示我的下拉列表。它正在播放文本框中的项目。可能是我在使用DropDownViewModel控制器中做错了什么。我在这里找不到这门课。你可以提供建议吗? – mmssaann 2013-07-16 05:18:25

+1

明白了,这是命名问题。我也必须为editortemplate文件命名为“ItemViewModel”。 – mmssaann 2013-07-16 05:20:43

1

方法,您可以使用HTML辅助DropDownList的建立你的下拉列表,但模型对象应该是inumerable 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") 

如果你不想建立自己的模型对象SelectListItem,那么你应该DropDownListFor

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

请大家看问题的更新 – SiberianGuy 2012-07-16 05:27:23