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);
}
}
// ...
}
}
我們不能告訴你某些代碼的英文描述是否始終有效。你必須發佈你正在問的代碼。否則,我們只會猜測。 – Hogan
你爲什麼自己寫這個?這就是ModelBinders所做的事情......只是讓你的函數'public ActionResult Create(MyModel模型)',它會自動爲你設置屬性! –
我自己寫這篇文章是因爲有些情況下我不能使用ModelBinders,例如在多模型創建頁面中。 – laurian