10

我有一个由员工信息组成的模型。在我的模型中,有一个名为 City 的属性,它定义了他居住的 Employee 所在的城市。属性如下图

    public string City{get;set;}

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

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

请告诉我“有没有什么方法可以直接在 SelectList() 方法中定义下拉列表的选项,就像 html 中的 ...?”

如果不是,我应该在哪里定义这个下拉列表的类,在哪里调用和在哪里渲染。我不知道在哪里定义值?我很困惑,因为这是 mvc,我们必须单独关注,我认为我们不能在任何地方定义任何东西?

提前致谢..

4

2 回答 2

13

你至少有两个选择:

1.) 将列表、数组或任何其他类型的城市集合添加到您的模型中

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

选项 1 可以是一个简单的字符串数组,或者可以是一个IEnumerable对象City。然后,您需要将此属性转换为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/库/dd460123%28v=vs.108%29.aspx)。您的代码将类似于:

model.Cities = new SelectList(GetCities(), model.City);

当然,这假设您有一个辅助方法 ( GetCities()) 可以从存储城市的任何地方加载它们。然后你的视图会是这样的:

@Html.DropDownListFor(m=>m.City, model.Cities)

视图引擎然后使用这些SelectListItems 来构建<select>元素及其<option>元素。

于 2013-03-04T05:49:01.590 回答
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

于 2013-03-04T12:13:47.673 回答