我是ASP.Net MVC 5的新手,我在理解下拉列表时遇到了问题。
我想显示一个绑定DTO对象的表单(因为该表单不会将数据库表一对一映射)。我的表单必须显示以下字段:
Name (edit box) Address (edit box) Type (dropdownlist that show always 3 fixed values: "Type1", "Type2" and "Type3"
如何编写DTO对象类和两个Create操作(显示表单的那个和处理帖子的另一个)?
我找到了一些在DTO对象中使用enum
的解决方案,其他在创建操作(GET)中使用viewbag
的解决方案......我很困惑!!!
答案 0 :(得分:3)
Trick是使用SelectListItem并使用DropDownFor。
在视图模型上创建一个属性,如
public class ViewModel {
string SelectedItem { get; set; }
List<SelectListItem> Items { get; set; }
}
在您的控制器中:
public ActionResult Edit() {
var items = new List<SelectListItem>() {
new SelectListItem() {Text = "Option1Text", Value = "Value1Text"},
new SelectListItem() {Text = "Option1Text", Value = "Value1Text"},
new SelectListItem() {Text = "Option1Text", Value = "Value1Text"}};
var model = new ViewModel() { Items = items };
return View(model);
};
在你看来
@model ViewModel
@Html.DropDownFor(x => x.SelectedItem, Model.Items)
然后,您可以在操作中获取所选值:
[HttpPost]
public ActionResult Edit(ViewModel model) {
var whatWasSelected = model.SelectedItem; // This will be "OptionXValue"
// Do more things
}
如果您要重新渲染视图,还应该对响应表单提交的任何操作重新填充选择列表项。这是因为选项集合不是通过原始请求传输的,因此ASP.NET MVC不知道如何自己重建集合。通过这样做,当您尝试在SelectListItem集合中设置所选项时,您将避免任何令人讨厌的异常。总体而言,响应行动看起来更像是:
[HttpPost]
public ActionResult Edit(ViewModel model) {
var items = new List<SelectListItem>() {
new SelectListItem() {Text = "Option1Text", Value = "Value1Text"},
new SelectListItem() {Text = "Option1Text", Value = "Value1Text"},
new SelectListItem() {Text = "Option1Text", Value = "Value1Text"}};
model.Items = items;
var whatWasSelected = model.SelectedItem; // This will be "OptionXValue"
// Do more things
}