2011-12-24 13 views
1

国を含むXMLファイルからSelectlist(IEnumerable)を生成し、これをDropDownListForで使用すると、Modelで指定された選択値が設定されません??Html.DropDownListForが正しい値を選択しません

@Html.DropDownListFor(model => model.Country, new SelectList(CommonHelpers.CountrySelectList(), "Value", "Text", Model.Country), "---Select---") 

@Html.DropDownListFor(model => model.Country, CommonHelpers.CountrySelectList(), "---Select---") 

任意のidears:

public static IEnumerable<SelectListItem> CountrySelectList() 
    { 
     var sRetVal = new List<SelectListItem>(); 
     string CachKey = "MVCXMLCountryList" + GetCulture(); 
     if (HttpContext.Current.Cache[CachKey] == null | 1 == 1) 
     { 
      string xmlFile = Path.Combine(HttpContext.Current.Server.MapPath("~"),  "Countries.xml"); 

      XmlDocument Doc = new XmlDocument(); 
      Doc.Load(xmlFile); 
      foreach (XmlNode Node in Doc.SelectNodes(String.Format("//Countries/language[@iso=\"{0}\"]/country", GetCulture()))) 
      { 
       var tmpSelect = new SelectListItem(); 
       tmpSelect.Value = Node.Attributes["iso2"].InnerText.ToString(); 
       tmpSelect.Text = Node.Attributes["name"].InnerText; 
       tmpSelect.Selected = false; 
       sRetVal.Add(tmpSelect); 
      } 
      sRetVal.Sort(CountrySort); 
      var prioritet = new string[] {"de","fo","se","no","dk"}; 
      switch (GetCulture()) 
      { 
       case "dk": prioritet = new string[] {"de","fo","se","no","dk"}; break; 
       default: prioritet = new string[] { "de", "se", "no", "dk", "gb" }; break; 
      } 

       foreach (string Country in (string[])prioritet) 
       { 
        selectedCountry = Country; 
        var tmpSel = sRetVal.Find(FindCurrentSelected); 
        sRetVal.RemoveAt(sRetVal.FindIndex(FindCurrentSelected)); 
        sRetVal.Insert(0, tmpSel); 
       } 
       //sRetVal[10].Selected = true; 
      HttpContext.Current.Cache[CachKey] = sRetVal; 
     } 
     else 
     { 
      sRetVal = (List<SelectListItem>)HttpContext.Current.Cache[CachKey]; 
     } 
     return (IEnumerable<SelectListItem>) sRetVal; 
    } 

は両方を試したことがありますか?

答えて

1

モデルプロパティ(国)と明示的に渡されたSelectListの選択した項目をフックアップするために、異なる名前を持つことが必要とされています。ここ

public static IEnumerable<SelectListItem> SetSelected(this IEnumerable<SelectListItem> selectList, string selectedValue) 
{ 
    var newList = new List<SelectListItem>(); 
    var oldList = selectList.ToList(); 
    for (var i = 0; i < oldList.Count; i++) 
    { 
     var item = oldList[i]; 
     item.Selected = string.Equals(item.Value, selectedValue, StringComparison.CurrentCultureIgnoreCase); 
     newList.Insert(i, item); 
    } 
    return newList; 
} 

とは、使用されます。選択された値が指定されていない場合、ブラウザはSelectListの最初の要素をデフォルトにします。これは、DropDownListヘルパの既知の制限です。 DDLチュートリアルを終了します。完成したコードをhttp://code.msdn.microsoft.com/Using-the-DropDownList-67f9367d にメールで送信して、チュートリアルを送信します.Rick.Anderson [at] microsoft.com

+0

Thx。リンクを見ても、私のコードがどこで失敗するのかわかりません。コントローラーからSleectList(SELECTEDセットあり)を供給するためにtrideを持っていますが、まだ動作していませんか? – DTA

0

あなたは、選択した値

public static IEnumerable<SelectListItem> CountrySelectList(string countryId) 
{ 
    var sRetVal = new List<SelectListItem>(); 
    // .......................   
    foreach (XmlNode Node in Doc.SelectNodes(String.Format("//Countries/language[@iso=\"{0}\"]/country", GetCulture()))) 
    { 
     var tmpSelect = new SelectListItem(); 
     tmpSelect.Value = Node.Attributes["iso2"].InnerText.ToString(); 
     tmpSelect.Text = Node.Attributes["name"].InnerText; 
     // Check for selected value 
     tmpSelect.Selected = string.Equals(tmpSelect.Value, countryId); 
     sRetVal.Add(tmpSelect); 
    } 
    //................... 
    return (IEnumerable<SelectListItem>)sRetVal; 
} 

それとも、あなたのためにこれを行うには、新しいヘルパーを作るためにチェックし、あなたの方法に「国」の値を渡す必要があります。このような何か:

@Html.DropDownListFor(model => model.Country, CommonHelpers.CountrySelectList().SetSelected(model.Country), "---Select---") 
+0

答えはThxです! SelectListでSELECTEDを設定しようとしましたが、(これを行う方法に関係なく)助けになりませんか?その答えがそこにあるかどうかを知るために、以下の答えを理解する必要があります。 – DTA