有什麼辦法可以說我的視圖模型屬性應該呈現爲DropDownList
(這樣我可以指定DropDownList
項)?ASP.NET MVC內置支持DropDownList編輯器模板
我發現了很多自定義實現,但我想應該有一個內置的方式來實現這樣一個基本的東西。
更新。我被Html.EditorForModel
方法渲染我的模型,我不想使用像Html.DropDownListFor
有什麼辦法可以說我的視圖模型屬性應該呈現爲DropDownList
(這樣我可以指定DropDownList
項)?ASP.NET MVC內置支持DropDownList編輯器模板
我發現了很多自定義實現,但我想應該有一個內置的方式來實現這樣一個基本的東西。
更新。我被Html.EditorForModel
方法渲染我的模型,我不想使用像Html.DropDownListFor
使用有沒有內置的模板,呈現一個下拉列表中,除了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>
}
}
方法,您可以使用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)
請大家看問題的更新 – SiberianGuy 2012-07-16 05:27:23
是什麼DropDownViewModel控制器,是ItemViewModel? – mmssaann 2013-07-16 05:12:15
這不顯示我的下拉列表。它正在播放文本框中的項目。可能是我在使用DropDownViewModel控制器中做錯了什麼。我在這裏找不到這門課。你可以提供建議嗎? – mmssaann 2013-07-16 05:18:25
明白了,這是命名問題。我也必須爲editortemplate文件命名爲「ItemViewModel」。 – mmssaann 2013-07-16 05:20:43