2011-02-14 60 views
0

我有一個模型如下:我使用DropDownListFor的模板助手不反映枚舉模型。爲什麼?

namespace Q01.Models 
{ 
    public enum Sex { Male, Female } 

    public class Person 
    { 
     public string Name { get; set; } 
     public Sex? Sex { get; set; } 
    } 
} 

甲公用事業類獲得SelectList對象來填充DropDownListFor定義如下:

using System; 
using System.Linq; 
using System.Web.Mvc; 

namespace Q01.Utilities 
{ 
    public static class Utilities 
    { 
     public static SelectList EnumToSelectList<TEnum>(this TEnum? obj) where TEnum: struct 
     { 
      var values = from TEnum x in Enum.GetValues(typeof(TEnum)) 
         select new { Value = x, Text = x }; 
      return new SelectList(values, "Value", "Text"); 
     } 
    } 
} 

創建該類型命名Sex.cshtml模板化助手的Sex如下:

@using Q01.Utilities 
@using Q01.Models 
@model Sex? 
@Html.DropDownListFor(x => x, Model.EnumToSelectList(), "--Select--") 

HomeController,創建的Person一個實例,並將其傳遞給視圖如下:

using System.Web.Mvc; 
using Q01.Models; 

namespace Q01.Controllers 
{ 
    public class HomeController : Controller 
    { 
     public ActionResult Create() 
     { 
      Person p = new Person(); 
      p.Sex = Sex.Female; 
      return View(p); 
     } 
    } 
} 

以及相應的視圖聲明如下:

輸出的屏幕截圖中示出如下
@using Q01.Utilities 
@model Q01.Models.Person 
@using (Html.BeginForm()) 
{ 
    <div>Using Sex.cshtml: @Html.EditorFor(x => x.Sex)</div> 
    <div>Not using Sex.cshtml: @Html.DropDownListFor(x => x.Sex, Model.Sex.EnumToSelectList(), "--Select--")</div> 
} 

enter image description here

的問題是:爲什麼Sex.cshtml不反映模型?它應該選擇Female而不是「 - 選擇 - 」。

回答

1

增值EnumToSelectList

public static class Utilities 
{ 
    public static SelectList EnumToSelectList<TEnum>(this TEnum? obj, object value) where TEnum: struct 
    { 
     var values = from TEnum x in Enum.GetValues(typeof(TEnum)) 
        select new { Value = x, Text = x }; 
     return new SelectList(values, "Value", "Text", value); 
    } 
} 

然後Model.EnumToSelectList(x.Sex)。您只需在SelectList構造函數中提供選定的值。

+0

我認爲我們不需要創建一個新的參數。我們可以用`obj`替換'value',它仍然有效。對? – LaTeX 2011-02-14 04:05:33