MVC DropDownListfor()基础知识
我有一个由员工信息组成的模型。 在我的模型中,有一个名为City的属性,用于定义他所居住的Employee城市。 该属性如下所示
public string City{get;set;}
现在我有一个包含一个表格的视图,该表格将由员工填写以进行注册。 我想使用下拉列表来选择城市。 我认为以下代码将用于我发现的下拉列表。 我的型号名称是Employee。
@Html.DropDownListFor(m=>m.City,new SelectList())
请告诉我“有没有办法直接在SelectList()方法中为dropdownlist定义选项,如…在html中?”
如果没有,我应该在哪里定义此下拉列表,调用位置和渲染位置。我不知道在哪里定义值? 我很困惑,因为这是mvc,我们必须分开关注,我认为我们无法在任何地方定义任何东西?
提前致谢..
您至少有两个选择:
1.)向模型添加列表,数组或任何其他集合类型的城市
2.)将SelectList属性添加到模型中
选项1可以是简单的字符串数组,也可以是IEnumerable
的City
对象。 然后,您需要将此属性转换为视图中的SelectListItem
对象的集合,作为DropDownList
绑定的一部分。
选项2的优点是能够直接绑定到DropDownList
,但需要在action方法中构造列表。
然后最终的结果是一样的,这只是你想要了解SoC的迂腐问题。
例如(假设您添加了名为Cities
的属性):
@Html.DropDownListFor(m=>m.City, Model.Cities.Select(city => new SelectListItem() { Text = city, Value = city, Selected = city == Model.City })
编辑:
要回答你的评论,我必须做出一些假设。 我假设你有一个名为EmployeeModel
的模型。 此模型具有属性City
,即纯字符串。 所以,这是你的模型的一部分,因为我认为它是:
public class EmployeeModel { public string City { get; set; } // ... other properties ... }
因此,如果您需要添加用于绑定到下拉列表的属性,则可以执行以下操作之一:
public class EmployeeModel { public string City { get; set; } public IEnumerable Cities { get; set; } // ... other properties ... }
要么
public class EmployeeModel { public string City { get; set; } public SelectList Cities { get; set; } // ... other properties ... }
此新属性将包含您允许用户选择的城市列表。
如果选择第一个选项,则从数据存储区加载IEnumerable,然后在视图中使用上面的第一个示例,该示例使用LINQ将Cities
属性中的每个字符串投影到新的SelectListItem
对象中。
如果使用第二个选项,则在将模型传递给视图之前,在操作中构建SelectList
。 这并不是非常困难,因为类提供了一个构造函数,它接受IEnumerable
(您的城市列表)和“选定值”,这将是City
属性(请参阅http://msdn.microsoft.com/en- us / library / dd460123%28v = vs.108%29.aspx )。 您的代码看起来像:
model.Cities = new SelectList(GetCities(), model.City);
当然,这假设您有一个辅助方法( GetCities()
)来从您存储的城市加载您的城市。 你的观点会有这样的东西:
@Html.DropDownListFor(m=>m.City, model.Cities)
然后,视图引擎使用这些SelectListItem
来构建元素及其
元素。
您可以在模型中使用它,但很快就会实现,但我不推荐它:
public class Place { public string City{get;set;} public SelectListItem[] Cities() { return new SelectListItem[2] { new SelectListItem() { Text = "London" }, new SelectListItem() { Text = "New York" } }; } }
……和你的观点
@Html.DropDownListFor(m => m.City, Model.Cities())
我认为这样的事情的最佳位置(但有点复杂)是你自己的htmlhelper
,用法看起来像:
@html.CityDropDownFor(m => m.City)
您可以很好地缓存城市,并使数据和UI工作不受模型影响。
如果你想了解更多关于创建自己的帮助者的信息,我建议你做一些[阅读]。 1