2013-03-04 64 views
9

我有一个由雇员信息组成的模型。在我的模型中有一个名为City的属性,它定义了他所居住的Employee的城市。下面显示的是标准MVC DropDownListfor()基本知识

public string City{get;set;} 

现在我有一个视图,其中包含一个将由员工填写的表单。我想使用下拉列表选择城市。我认为下面的代码将用于我发现的下拉菜单。我的模型名称是Employee。

@Html.DropDownListFor(m=>m.City,new SelectList()) 

请告诉我“有没有什么办法)直接定义为的SelectList下拉列表的选项(方法一样......在HTML吗?”

如果没有,我应该在哪里定义这个下拉类,哪里调用以及渲染的位置。我不知道在哪里定义值?我很困惑,因为这是MVC,我们必须分开关注,我认为我们无法在任何地方定义任何东西?

在此先感谢..

+0

值从哪里来?它应该是数据库表中的外键,硬编码的值,还有其他的东西吗? – 2013-03-04 05:43:07

+0

http://stackoverflow.com/questions/10484774/dropdown-in-mvc – 2013-03-04 05:45:04

回答

10

您至少有两种选择:

1)添加列表,阵列或城市的任何其他集合类型模型

2)将SelectList属性添加到您的模型

选项1可以像字符串数组一样简单,也可以是IEnumerableCity对象。然后您需要将该属性转换为视图中SelectListItem对象的集合,作为DropDownList绑定的一部分。

选项2的优点是能够直接绑定到DropDownList,但要求您在操作方法中构建列表。

然后最终的结果是一样的,这只是一个关于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<string> 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 s到建立<select>元素,它的<option>元素。

+0

你能否详细说明1和2选项,以便我能够轻松理解。我仍然面临问题。 – 2013-03-04 06:49:53

2

你可以在你的模型都这样了,它很快取得,虽然我不会推荐它:

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