Html.DropDownListFor不选择值

时间:2013-08-22 15:26:09

标签: asp.net-mvc asp.net-mvc-4

我有action检索数据并将其发送到view。在视图中,我有两个下拉菜单。

首先下拉显示称呼(例如“先生”,“女士”等)并且不会因某种原因选择我发送的值。另一个下拉列表显示语言列表并正确选择我发送给视图的值。视图中的相关代码如下所示。

@Html.DropDownListFor(model => model.Salutation, ViewBag.salutation as IEnumerable<SelectListItem>)

@Html.DropDownListFor(model => model.Language, ViewBag.languages as IEnumerable<SelectListItem>)

在控制器中,我有以下代码来获取下拉数据。

ViewBag.salutation = new List<SelectListItem>() { 
                                        new SelectListItem() { Text = "", Value = "" },
                                        new SelectListItem() { Text = "Mr.", Value = "Mr." }, 
                                        new SelectListItem() { Text = "Ms.", Value = "Ms." }, 
                                        new SelectListItem() { Text = "Mrs.", Value = "Mrs." } 
                                    };

var languages = (from l in db.Languages.ToList()
                         select new SelectListItem()
                         {
                             Text = l.Language,
                             Value = l.LanguageId.ToString()
                         }).ToList();
        languages.Insert(0, new SelectListItem() { Text = "", Value = "" });
        ViewBag.languages = languages;

我能想到的唯一区别是语言下拉列表中有一个整数作为值,而称呼下拉列表则将文本作为值。这是为什么称呼下降不起作用?我知道我可以通过每个称呼List<SelectListItem>项并根据我从数据库中检索到的值设置Selected属性。但我希望能有更清洁的方法来做到这一点。

有什么想法吗?

由于

更新

我决定做我为另一个项目所做的事情。

IList<SelectListItem> _salutation = new List<SelectListItem>() 
        { 
            new SelectListItem() { Value = "", Text = "" },
            new SelectListItem() { Value = "Mr.", Text = "Mr." }, 
            new SelectListItem() { Value = "Ms.", Text = "Ms." }, 
            new SelectListItem() { Value = "Mrs.", Text = "Mrs." } 
        };
        // I could put the following in the declaration above, but for testing purposes it's in foreach loop.
        foreach (var item in _salutation)
        {
            // compare to what's retrieved from database
            item.Selected = item.Value == _viewData.Salutation;
        }
        ViewBag.salutation = _salutation;

foreach循环之后,我输出.Value中每个项目的.Selected_salutation属性,并获得所有正确的值,其中一个项目被选中。在视图中我做了以下内容。

        @foreach (var item in ViewBag.salutation as IEnumerable<SelectListItem>)
        {
            <b>@item.Value : @item.Text : @item.Selected</b><br />
        }

所有正确的文字/值都出现但没有被选中!如果我在执行@Html.DropDownListFor()后输出值,就会发生这种情况。如果我在html帮助器之前输出ViewBag.salutation,则选择正确的值。

我发现以下文章很有用:DropDownListFor with ASP.NET MVC

我没有使用ViewBag,而是将以下内容添加到ViewModel中。 (显示致敬的部分下降。)

public class TheViewModel
{
    private IList<string> _salutations = new List<string>() { "", "Mr.", "Ms.", "Mrs." };

    public IEnumerable<SelectListItem> SalutationItems
    {
        get
        {
            var salutations = _salutations.Select(s => new SelectListItem { Value = s, Text= s });
            return salutations;
        }
    }
    // The rest of the ViewModel
}

View我有以下内容。

@Html.DropDownListFor(model => model.Salutation, Model.SalutationItems)

2 个答案:

答案 0 :(得分:4)

您可以提供DropDownListFor,而不是仅仅将列表提供给SelectList帮助程序。 SelectList构造函数采用列表,允许您显式设置选定的值以及允许您指定文本和值字段的重载。

@Html.DropDownListFor(model => model.Salutation,
                      new SelectList(ViewBag.salutation as IEnumerable<SelectListItem>,
                                     "Value", "Text", Model.Salutation))

答案 1 :(得分:0)

试试这个,

@Html.DropDownListFor(m =>m.DDCountryModel,IEnumerable<SelectListItem>)ViewBag.salutation)

@Html.DropDownListFor(model => model.Language, IEnumerable<SelectListItem>)ViewBag.languages)

你的模型应该是这样的,

 public class Model
{
public IEnumerable<SelectListItem> DDCountryModel{ get; set; }
public IEnumerable<SelectListItem> Language{ get; set; }
}