2012-12-31 49 views
1

我需要在頁面上一個DropDownList,所以我嘗試這樣:Html.DropDownListFor()更改ASP.NET中的MVC SelectListItems

操作:

[HttpGet] 
public ActionResult GetPoint() { 

    ... 
    List<SelectListItem> zooms = new List<SelectListItem>(); 
    for (int i = 0; i <= 21; i++) { 
     if (i == 9) 
     zooms.Add(new SelectListItem() { Selected = true, Text = i.ToString(), Value = i.ToString() }); 
     else 
     zooms.Add(new SelectListItem() { Selected = false, Text = i.ToString(), Value = i.ToString() }); 
      } 
    model.myselectlist = zooms; 
    ... 

    return View(model); 
} 

,並考慮:

@Html.DropDownListFor(model => model.Zoom, Model.myselectlist , new { @class = "dropdown" }) 

因此,正如我所料,我們有一個DropDownList與9是選定的項目。

但在同一視圖我需要另一個下拉所以這是我實現:

[HttpGet] 
public ActionResult GetPoint() { 

    ... 

    List<SelectListItem> places = new List<SelectListItem>(); 
    places.Add(new SelectListItem() { Text = "NY", Value = "NY", Selected = false }); 
    places.Add(new SelectListItem() { Text = "CA", Value = "CA", Selected = false }); 
    places.Add(new SelectListItem() { Text = "TX", Value = "TX", Selected = false }); 
    places.Add(new SelectListItem() { Text = "NH", Value = "NH", Selected = true }); 
    places.Add(new SelectListItem() { Text = "NV", Value = "NV", Selected = false }); 
    model.myselectlistII = places; 

    ... 

    return View(model); 
} 

,並鑑於我:

@Html.DropDownListFor(model => model.Place, Model.myselectlistII , new { @class = "dropdown" }) 

所以你看我有一個列表的NH物品有selected = true

而且我期望一個下拉列表,NH選擇,但沒有發生,並總是選擇第一個項目。

鑑於我有一個奇怪的行爲,我調試代碼在行動結束,並在視圖頁面@Html.DropDownListFor行的開始,每一個事情是確定的,但此行後,我再次檢查Model.myselectlistII所選擇的項目有改變了,所有物品都有false的選擇屬性,我不明白髮生了什麼?哪裏有問題?爲什麼第一個DropDownFor沒有改變任何東西,但第二個改變我的列表?你的建議是什麼?

+0

你給模型字段'Place'設置了任何值(例如,在構造函數或其他地方)?如果是這樣的話,它會覆蓋你的列表中的'Selected'字段... –

+0

@SamuelCaillerie你的權利,其實我沒有設置任何東西,我必須設置默認值。 – Saeid

+0

@SamuelCaillerie所以請張貼你的答案,爲下一步提及 – Saeid

回答

0

Samuel Caillerie是正確的。您正在使用DropDownList 對於,它將您的屬性縮放並放置到選擇列表中。無論這些屬性的價值是視圖呈現時將選擇什麼。還沒有找到這個文件的一個很好的peice的,但這裏是另一個堆棧溢出後,以幫助回,最多:

asp.net mvc 3 pre-select Html.DropDownListFor not working in nerd dinner

0

我在項目中的一個做了什麼,是那種很有用,是開發2更多過載
DropDownListFor其中接受selectedValue

namespace MyMvcApplication.Helpers 
{ 
    public static class ExtensionMethods 
    { 
     public static MvcHtmlString DropDownListFor<TModel, TProperty> 
          (this HtmlHelper<TModel> helper, 
           Expression<Func<TModel, TProperty>> expression, 
           string selectedValue, 
           IEnumerable<SelectListItem> selectList, 
           string optionLabel, 
           object htmlAttributes) 
     { 
      if (string.IsNullOrEmpty(selectedValue)) 
       selectedValue = string.Empty; 
      if (selectList != null) 
      { 
       foreach (SelectListItem sli in selectList) 
       { 
        if (sli.Value.ToLower().Trim() == selectedValue.ToLower().Trim()) 
        { 
         sli.Selected = true; 
         break; 
        } 
       } 
      } 
      else 
      { 
       selectList = new List<SelectListItem>() 
            { new SelectListItem() 
              { Text = "", Value = "", Selected = true } 
            }; 
      } 
      return helper.DropDownListFor(expression, selectList, optionLabel, htmlAttributes); 
     } 


     public static MvcHtmlString DropDownListFor<TModel, TProperty> 
          (this HtmlHelper<TModel> helper, 
           Expression<Func<TModel, TProperty>> expression, 
           string selectedValue, 
           IEnumerable<SelectListItem> selectList, 
           string optionLabel, 
           IDictionary<string, object> htmlAttributes) 
     { 
      if (string.IsNullOrEmpty(selectedValue)) 
       selectedValue = string.Empty; 
      if (selectList != null) 
      { 
       foreach (SelectListItem sli in selectList) 
       { 
        if (sli.Value.ToLower().Trim() == selectedValue.ToLower().Trim()) 
        { 
         sli.Selected = true; 
         break; 
        } 
       } 
      } 
      else 
      { 
       selectList = new List<SelectListItem>() 
            { new SelectListItem() 
              { Text = "", Value = "", Selected = true } 
            }; 
      } 
      return helper.DropDownListFor(expression, selectList, optionLabel, htmlAttributes); 
     } 

    } 
} 

所以意見,我可以一個字符串作爲了selectedValue傳遞給DropDownListFor,如:

@using MyMvcApplication.Helpers 

@Html.DropDownListFor(model => model.MyData, 
           "Default Value for DropDownList", //Or Model.MySelectedValue 
           Model.MySelectList, null, null) 
0

請,如果有查詢字符串同名的照顧,這將覆蓋該行爲,不知道隱藏字段同名

DropDownListFor將使用查詢字符串DinnerID的的值,如果 發現 大段引用

0

這個問題的解決方案是簡單的,我們都覺得...

我們所需要的當從控制器返回視圖時,在視圖模型上設置下拉列表所綁定的元素的屬性 - 例如:model.Zoom ='NH',例如

這樣,當我們做到這一點

@Html.DropDownListFor(model => model.Zoom, Model.myselectlist , new { @class = "dropdown" }) 

中的HtmlHelper會自動拿起默認值,顯示在DropDownList的

simples!

希望它可以幫助你和所有其他人 - 像我一樣! - 已經花了很多時間尋找解決這個明顯問題的方法。

0

檢查出來傢伙!超級靜態功能懶惰的方式來選擇/選擇/綁定dropdownlistfor mvc剃刀引導樣式;)作爲獎金去塞法語或英文說明!你的改善,但你會很容易得到的想法。 玩得開心! MightyMart ...

   <div class="form-group"> 
        <label>@(HttpContext.Current.Session["culture"].ToString().Equals("fr-CA") ? "Quel est votre niveau d'expertise" : "What is your skill level")</label> 
        @if (Model.ClientLevel == null) 
        { 
         <select class="form-control" name="ClientLevel"> 
          <option selected value="0">@(HttpContext.Current.Session["culture"].ToString().Equals("fr-CA") ? "Choisir un niveau" : "Choose a level")</option> 
          <option value="1">@(HttpContext.Current.Session["culture"].ToString().Equals("fr-CA") ? "Débutant" : "Beginner")</option> 
          <option value="2">@(HttpContext.Current.Session["culture"].ToString().Equals("fr-CA") ? "Intermédiaire" : "Intermediate")</option> 
          <option value="3">@(HttpContext.Current.Session["culture"].ToString().Equals("fr-CA") ? "Advanced" : "Advanced")</option> 
          <option value="4">@(HttpContext.Current.Session["culture"].ToString().Equals("fr-CA") ? "Expert" : "Expert")</option> 
          <option value="5">@(HttpContext.Current.Session["culture"].ToString().Equals("fr-CA") ? "Autre" : "Other")</option> 
         </select> 
        } 
        else 
        { 

         List<SelectListItem> listItems = new List<SelectListItem>(); 
         listItems.Add(new SelectListItem() { Text = "Choose a level", Value = "Choose a level"}); 
         listItems.Add(new SelectListItem() { Text = "Beginner", Value = "Beginner" }); 
         listItems.Add(new SelectListItem() { Text = "Intermediate", Value = "Intermediate"}); 
         listItems.Add(new SelectListItem() { Text = "Advanced", Value = "Advanced"}); 
         listItems.Add(new SelectListItem() { Text = "Expert", Value = "Expert"}); 
         listItems.Add(new SelectListItem() { Text = HttpContext.Current.Session["culture"].ToString().Equals("fr-CA") ? "Autre" : "Other", Value = "Other"}); 

         @Html.DropDownListFor(m => m.ClientLevel, listItems, new { @class = "form-control" }) 
        } 
       </div>