2012-06-06 59 views
4

我對MVC中的HTML幫助器擴展很陌生,更不用說在Razor中,我正在尋找一種簡單,整潔的方式來顯示一年中12個月的下拉列表,數值爲數字,文本爲日期的「MMM」表示。MVC Razor - 使用@ Html.DropDownListFor()在今年的12個月

所以在最後的HTML應該是這樣的:

<select> 
    <option value="1">Jan</option> 
    <option value="2">Feb</option> 
    <option value="3">Mar</option> 
    <!-- etc --> 
</select> 

是否有可能在視圖中完全做到這一點?我需要一個答案,用戶@Html.DropDownListFor(),所以我可以利用自動模型綁定。我接近下面的代碼行,但它沒有明確的值。

@Html.DropDownListFor(model => Model.DobMonth, new SelectList(Enumerable.Range(1,12).Select(r => new DateTime(2000, r, 1).ToString("MMM"))), "- -") 

由於非技術原因,我不能使用jQuery datepicker。

回答

19

你就要成功了,問題是,如果在創建SelectList當你不提供dataValuedataText參數它只是呼籲項目ToString,並把它們作爲選項的文本。

你需要的是從你的選擇返回文本,值對:

@Html.DropDownListFor(model => Model.DobMonth, new SelectList(
     Enumerable.Range(1, 12) 
      .Select(r => new 
          { 
           Text = new DateTime(2000, r, 1).ToString("MMM"), 
           Value = r.ToString() 
          }), 
     "Value", "Text", Model.DobMonth)) 

如果你想有一個「空」的項目,你需要手動添加:

@Html.DropDownListFor(model => Model.DobMonth, new SelectList(
     new [] { new { Text = "- -", Value = (string)null } }.Concat(
     Enumerable.Range(1, 12) 
      .Select(r => new 
          { 
           Text = new DateTime(2000, r, 1).ToString("MMM"), 
           Value = r.ToString() 
          })), 
     "Value", "Text", Model.DobMonth)) 
+0

恰到好處,你已經給了我確切的東西,謝謝。不要總是得到這樣簡潔,準確的答案。 –