2016-12-15 26 views
0

我目前正在開發使用C#和Asp.Net MVC正在開發的應用程序。擴展方法不工作,因爲它應該

在其中一個用戶必須選擇的10 DropDowns左右。所選值存儲在數據庫中。

例如:

  1. DropDown1ValueText顯示爲First Main Fault
  2. DropDownOneValueText出現First Sub Fault

現在,用戶可以回來和編輯記錄。所以我想向他們展示DropDown,它已經被選中並存儲在數據庫中。

爲此,我利用下面的擴展方法

public static IEnumerable<SelectListItem> ToSelectListItems<T>(this IEnumerable<T> items, Func<T, string> textSelector, Func<T, string> valueSelector, Func<T, bool> selecter) 
{ 
    return items.OrderBy(item => textSelector(item)) 
     .Select(item => 
     new SelectListItem 
     { 
      Selected = selecter(item), 
      Text = textSelector(item), 
      Value = valueSelector(item) 
     }); 
} 

我稱之爲作爲

var mainFaultSelectedDdl = mainFaults.ToSelectListItems(
      m => m.MainFaultDescription, 
      m => m.Id.ToString(), 
      m => m.Id == mainFaultId); //mainFaultId here equals to 1. I've also tried m.Id.ToString() == mainFaultId.ToString() but still the same issue 

var subFaultSelectedDdl = subFaults.ToSelectListItems(
      s => s.SubFaultDescription, 
      s => s.SubFaultDescription, 
      s => s.SubFaultDescription == erst.SubFault); //erst.SubFault here equals to One 

當調試我的代碼,我可以看到上述兩種DropDownsSelected被設置爲True但在視圖中,未選擇MainFault DropDown,但選擇了SubFault DropDown

有人可以告訴我哪裏出錯了請。

這是怎麼了,我目前的Serial.MainFault值綁定到你的財產的價值,你的情況產生DropDown視圖

@Html.DropDownListFor(m => m.Serial.MainFault, Model.MainFaultDdl, "Please select a main fault", new { id = "mainFaults", @class = "form-control main-ddl" }) 
@Html.DropDownListFor(m => m.Serial.SubFault, Model.SubFaultDdl, "Please select a sub fault", new { id = "subFaults", @class = "form-control main-ddl" }) 
+0

你是如何在視圖中生成你的下拉列表的。當你綁定到模型 –

+0

,你在哪裏設置'mainFaultId'和'erst.SubFault'的值,設置'SelectListItem'的'Selected'屬性會被忽略? – HimBromBeere

+0

@StephenMuecke我已經更新了我的問題以包含視圖中的代碼。它適用於一個而不是另一個,這就是我困惑 – Code

回答

1

模型結合的作品。如果Serial.MainFault的值與選項值(由mainFaults中的對象的Id屬性的值定義)中的一個匹配,則將選擇它。如果它不匹配一個值,那麼第一個選項將被選中,因爲必須是。

設置的SelectListItemSelected屬性使用DropDownListFor()方法時,因爲內部的方法建立自己的IEnumerable<SelectListItem>並基於你的綁定到該屬性的值Selected屬性忽略(注意,有一個例外 - 在如this answer所述的循環中使用DropDownListFor()的情況)。

但是,您的擴展方法似乎並不必要,因爲MVC已經有一種方法可以使用SelectList構造函數之一構建IEnumerable<SelectListItem>

根據您所顯示的代碼,你的GET方法可以簡單地

var model = new YourModel(); 
model.Serial.MainFault = mainFaultId; // set the value to be displayed initially 
model.MainFaultDdl = new SelectList(mainFaults, "Id", "MainFaultDescription"); // generate the options 
return View(model); 

或者您可以使用以下方法來生成選項

model.MainFaultDdl = mainFaults.Select(x => new SelectListItem() 
{ 
    Value = x.Id.ToString(), 
    Text = x.MainFaultDescription 
}; 

,並會顯示正確的選項在視圖中。

+0

謝謝你。 – Code

相關問題