SelectList所选项目未保留设置

时间:2013-07-18 18:50:59

标签: c# asp.net-mvc-3 razor html-select selectlistitem

我的网站上有一个下拉列表,其中包含多种语言。当用户选择其他语言时,页面文本将重新加载到该语言。我想通过指定所选语言的选定索引来改变语言下拉以反映这一点。但是,当我执行此操作时,HTML中的下拉列表不会更改,并始终显示列表中的第一个项目。

我有以下ViewModel:

public class BaseViewModel
{
  public BaseViewModel()
  {
  }

  public IEnumerable<SelectListItem> LanguageSelectListItems { get; set; }
}

当我构造SelectListItems列表时,将成功填充LanguageSelectListItems属性。当它传递到视图中时,所选语言SelectListItem设置为true - 在本例中为Swedish。到目前为止一切都很好。

但是当视图调用Html.DropDownList()时,所选语言的selected属性将更改为false。一些图片可能会更好地解释这一点。

在致电@Html.DropDownList("language", Model.LanguageSelectListItems)

之前

before html.dropdownlist

@Html.DropDownList("language", Model.LanguageSelectListItems)

之后

after html.dropdownlist

您可以看到SelectListItem上瑞典语的Selected属性已更改为false,这是生成的HTML:

<select name="language" id="language">
    <option value="2">English</option>
    <option value="3">Finnish</option>
    <option value="4">Swedish</option>
</select>

为什么会发生这种情况的任何想法?

编辑:正在填充LanguageSelectListItems并使用此功能设置所选语言(其中languageslanguage的可枚举):

public static IEnumerable<SelectListItem> GetLanguageList(int selectedIndex)
{
  var selectListItems = new List<SelectListItem>();
  foreach (var language in languages)
  {
    selectListItems.Add(new SelectListItem() { Text = language.Name, Value = language.Id });
  }

  if (selectedIndex >= 0)
  {
    selectListItems[selectedIndex].Selected = true;
  }

  return selectedListItems;
}

1 个答案:

答案 0 :(得分:1)

如果有其他人发现自己处于这种奇怪的境地,我的问题的解决方案就是这个。

在使用SelectList下拉列表返回视图之前的控制器操作方法中,有这行代码:

ViewBag.language = Model.Language;

这似乎干扰了在视图中构建SelectList的方式:

@Html.DropDownList("language", Model.LanguageSelectListItems)

从控制器中删除此行后,SelectList开始默认为正确的值。这修复了Html.DropDownList和Html.DropDownListFor。我还在网站的另一个行为相同的区域发现了这一点,但这次使用的是ViewData[""]

因此,如果您遇到此问题,请检查您的本地区域是否使用与您尝试构建下拉列表的属性相同名称的ViewBag和ViewData的任何用途。