首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC DropDownListfor()基础

MVC DropDownListfor()基础
EN

Stack Overflow用户
提问于 2013-03-04 13:40:00
回答 2查看 31.6K关注 0票数 10

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

代码语言:javascript
复制
    public string City{get;set;}

现在我有一个视图,其中包含一个表单,该表单将由员工填写以进行注册。我想使用下拉列表来选择城市。正如我发现的那样,我认为下面的代码将用于dropdown。我的名字叫Employee。

代码语言:javascript
复制
    @Html.DropDownListFor(m=>m.City,new SelectList())

请告诉我“有没有办法在SelectList()方法中直接定义dropdownlist的选项,就像在html中一样?”

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

提前谢谢..

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-04 13:49:02

您至少有两个选择:

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

2.)向模型添加SelectList属性

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

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

那么最终的结果是一样的,这只是一个关于SoC的书呆子气的问题。

例如(假设您添加了一个名为Cities的属性):

代码语言:javascript
复制
@Html.DropDownListFor(m=>m.City, Model.Cities.Select(city => new SelectListItem()
{
    Text = city,
    Value = city,
    Selected = city == Model.City
})

编辑:

为了回答你的评论,我不得不做一些假设。我假设您有一个名为EmployeeModel的模型。这个模型有一个属性City,它是一个普通字符串。所以,这是你的模型的一部分,正如我假设的那样:

代码语言:javascript
复制
public class EmployeeModel
{
    public string City { get; set; }

    // ... other properties ...
}

因此,如果您需要将绑定属性添加到您的下拉列表中,可以执行以下操作之一:

代码语言:javascript
复制
public class EmployeeModel
{
    public string City { get; set; }

    public IEnumerable<string> Cities { get; set; }

    // ... other properties ...
}

代码语言:javascript
复制
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)。您的代码将如下所示:

代码语言:javascript
复制
model.Cities = new SelectList(GetCities(), model.City);

当然,这假设您有一个帮助器方法(GetCities()),可以从存储城市的位置加载这些城市。然后,您的视图将如下所示:

代码语言:javascript
复制
@Html.DropDownListFor(m=>m.City, model.Cities)

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

票数 13
EN

Stack Overflow用户

发布于 2013-03-04 20:13:48

你可以在你的模型中实现这一点,它很快就实现了,尽管我不推荐这样做:

代码语言:javascript
复制
public class Place
{
    public string City{get;set;}
    public SelectListItem[] Cities()
    {
        return new SelectListItem[2] { new SelectListItem() { Text = "London" }, new SelectListItem() { Text = "New York" } };
    }
}

...and你的视图

代码语言:javascript
复制
@Html.DropDownListFor(m => m.City, Model.Cities())

我认为最适合做这类事情(但有点复杂)的地方是你自己的htmlhelper,用法可能类似于:

代码语言:javascript
复制
@html.CityDropDownFor(m => m.City)

您可以很好地缓存城市,并且它可以将数据和UI工作保留在模型之外。

如果你想了解更多关于创建你自己的帮助器的信息,我建议你读一读。1

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15195256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档