MVC DropDownListfor()基础知识

时间:2013-03-04 05:40:00

标签: c# .net razor asp.net-mvc-4

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

    public string City{get;set;}

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

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

请告诉我“有没有办法直接在SelectList()方法中为dropdownlist定义选项,如...在html中?”

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

提前致谢..

2 个答案:

答案 0 :(得分:12)

您至少有两个选择:

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

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

选项1可以是一个简单的字符串数组,也可以是IEnumerableCity个对象。然后,您需要将此属性转换为视图中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<string> Cities { get; set; }

    // ... other properties ...
}

public class EmployeeModel
{
    public string City { get; set; }

    public SelectList Cities { get; set; }

    // ... other properties ...
}

这个新属性将包含您允许用户选择的城市列表。

如果选择第一个选项,则从数据存储区加载IEnumerable,然后在视图中使用上面的第一个示例,该示例使用LINQ将Cities属性中的每个字符串投影为新的{{1对象。

如果使用第二个选项,则在将模型传递给视图之前,在操作中构建SelectListItem。这并不是非常困难,因为类提供了一个构造函数,它使用SelectList(您的城市列表)和“选定值”,这将是IEnumerable属性(请参阅{{3} })。您的代码看起来像:

City

当然,这假设您有一个辅助方法(model.Cities = new SelectList(GetCities(), model.City); )来从您存储的城市加载您的城市。你的观点会有这样的结论:

GetCities()

视图引擎然后使用这些@Html.DropDownListFor(m=>m.City, model.Cities) 来构建SelectListItem元素及其<select>元素。

答案 1 :(得分: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)

您可以很好地缓存城市,并使数据和用户界面保持在您的模型之外。

如果您想了解更多关于创建自己的帮助者的信息,我建议稍微阅读一下[{3}}