2014-02-07 39 views
2

我有一個MVC 4 CRUD表單。該模型有一個屬性MyProp其類型是一個枚舉:Enum.Parse From FormCollection

public enum MyType 
{ 
    Item1, 
    Item2 
} 

在我看來,我有:

@Html.DropDownListFor(model => model.MyProp, typeof(MyType).ToSelectList(), new { onchange="copyToHidden('MyType');" }) 
@Html.HiddenFor(model => model.MyProp) 

copyToHidden()只是複製從下拉到隱藏的輸入值。 ToSelectList()是我寫的一個擴展,它創建了一個枚舉值的選擇列表。

我使用隱藏字段來保存下拉值,因爲我想在某些情況下使下拉列表只讀(禁用下拉列表)。假設我從下拉列表中選擇Item1,然後我提交表單;有兩種可能性:

  • 下拉被禁止,然後在下拉啓用值被作爲"Item1"
  • ,然後該值被作爲"Item1,Item1"

然後我填充我模型使用FormCollection對象並使用反射。當我檢測到屬性類型是一個枚舉時,我使用Enum.Parse解析字符串值...並且令我驚訝的是,即使啓用了下拉菜單,它也能工作:Enum.Parse("Item1,Item1")給我MyType.Item1!這正是我想要的,但我很懷疑,因此我的問題是:會一直工作嗎?

這裏的C#部分:

public enum MyType 
{ 
    Item1, 
    Item2 
} 

public class MyModel 
{ 
    public MyType MyProp { get; set; } 
} 

public class MyModelController 
{ 
    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(FormCollection formValues) 
    { 
     var model = new MyModel(); 
     foreach (string name in formValues) 
     { 
      PropertyInfo property = typeof(MyModel).GetProperty(name, BindingFlags.Public | BindingFlags.Instance); 
      if (property.PropertyType.IsEnum) 
      { 
       var value = Enum.Parse(property.PropertyType, formValues[name]);// Will this always work? 
       property.SetValue(model, value, null); 
      } 
     } 
     // ... 
    } 
} 
+1

我們不能告訴你某些代碼的英文描述是否始終有效。你必須發佈你正在問的代碼。否則,我們只會猜測。 – Hogan

+0

你爲什麼自己寫這個?這就是ModelBinders所做的事情......只是讓你的函數'public ActionResult Create(MyModel模型)',它會自動爲你設置屬性! –

+0

我自己寫這篇文章是因爲有些情況下我不能使用ModelBinders,例如在多模型創建頁面中。 – laurian

回答

0

我想這種行爲是由於添加到枚舉一個功能叫做Flag;就我而言,您可以擁有多個相應名稱的枚舉值。看看下面的例子:

 public enum Test 
    { 
     A = 1, 
     B = 2, 
     C = 4 
    } 

     var value = "A,B"; 
     var parsedValue = Enum.Parse(typeof (Test), value); 

和令人驚訝的,

 parsedValue = 3 

因此,在您的情況,至於你的枚舉值互不衝突別人你可以肯定的解析機制是否正常工作。