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 の後

スウェーデン語の Selected プロパティが SelectListItem で 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 の両方が修正されました。動作が同じであるサイトの別の領域でもこれを発見しましたが、今回は aViewData[""]が使用されていました.

したがって、この問題が発生した場合は、ドロップダウンを構築しようとしているプロパティと同じ名前を使用する ViewBag および ViewData が使用されていないか、ローカル エリアを確認してください。

于 2013-07-22T19:53:59.830 に答える