2

我的网站上有一个下拉菜单,其中包含多种语言。当用户选择不同的语言时,页面文本会重新加载为该语言。我希望通过指定所选语言的所选索引来更改语言下拉菜单以反映这一点。但是,当我这样做时,HTML 中的下拉菜单不会更改,并且始终显示列表中的第一项。

我有以下 ViewModel :

public class BaseViewModel
{
  public BaseViewModel()
  {
  }

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

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

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

打电话之前@Html.DropDownList("language", Model.LanguageSelectListItems)

在 html.dropdownlist 之前

之后立马@Html.DropDownList("language", Model.LanguageSelectListItems)

在 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 并使用此函数设置所选语言(其中languages是 的可枚举language):

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;
}
4

1 回答 1

1

好吧,如果其他人发现自己处于这种奇怪的情况,我的问题的解决方案就是这样。

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

ViewBag.language = Model.Language;

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

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

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

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

于 2013-07-22T19:53:59.830 回答