2012-07-16 95 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