在阅读了许多关于如何在各种网站上设置下拉菜单的教程后,我设法拼凑了一些东西,但仍然停滞不前。
有人告诉我,我下面的代码应该包含在视图模型中,目前它位于我的视图顶部:
var genderItems = new List<ListItem>
{
new ListItem { Text = "Unisex", Value = "0" },
new ListItem { Text = "Female", Value = "1" },
new ListItem { Text = "Male", Value = "2" }
};
var statusItems = new List<ListItem>
{
new ListItem { Text = "Inactive", Value = "0" },
new ListItem { Text = "Active", Value = "1" }
};
在同一视图中,我一直在使用此代码生成一个下拉框:
@Html.DropDownList("RoomGender", new SelectList(genderItems, "Value", "Text", Model.RoomGender))
有人能解释一下我应该如何抽象它,然后将它传递给视图,而不删除我已经附加的Room
模型,因为这是为数据库建模的模型。
这可能很简单,我试过研究它,但我真的很难把它拼凑起来。
这是一个用于将EnumGender绑定到视图的方法。假设Student是我绑定到视图的模型,
namespace MyApp.Models
{
public class Student
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public Gender Gender { get; set; }
}
public enum Gender
{ Male = 0, Female = 1 }
}
然后在你的视图
@Html.DropDownListFor(model => model.Gender, new SelectList(Enum.GetValues(typeof(MyApp.Models.Gender))))
我希望你现在就拿到!
这个Room
模型不是已经是您的视图模型了吗?视图模型只是一个包含视图所需数据的类。按照惯例,它们往往被称为视图模型,以将它们与领域模型区分开来。在您的情况下,您可以为StatusItems
和GenderItems
向Room
添加几个属性。或者,创建一个具有属性Room
和2个列表属性的RoomViewModel
,并将其传递给视图。
理想情况下,您应该创建一个RoomViewModel
,并为需要在视图中显示的所有数据创建属性。这不需要与域对象的结构相匹配。在MVC层中,您将获取从中检索视图数据的域对象,并在视图模型创建过程中映射这些属性。您可以手动执行此操作,也可以使用类似Automapper
的工具。
为了将下拉列表数据添加到视图中,我建议将数据添加到ViewBag
中。
你可以在这里看到一个例子:http://jnye.co/Posts/12/creating-cascading-dropdownlists-using-mvc-4-and-jquery
首先将这些值添加到ViewBag
中。通常,我把它放在它自己的方法中,因为每次加载页面时都需要调用它(包括在失败的表单子会话上显示时):
//You can keep your current list setup, I have simply shortened it for brevity
var genderItems = new List<string> {"Unisex", "Female", "Male"};
ViewBag.Genders = new SelectList(genderItems);
那么在你看来:
@Html.DropDownList("gender", ViewBag.Genders as SelectList)
或者,如果您想将结果绑定到视图模型上的属性:
@Html.DropDownListFor(m => m.Property, ViewBag.Genders as SelectList)