我有一个MVC 4 CRUD表格。该模型具有属性MyProp
,其类型为枚举:
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);
}
}
// ...
}
}
答案 0 :(得分:0)
我猜这种行为是由于添加到名为Flag的枚举的功能;就我而言,你可以拥有一个具有多个对应名称的枚举值。请参考以下示例:
public enum Test
{
A = 1,
B = 2,
C = 4
}
var value = "A,B";
var parsedValue = Enum.Parse(typeof (Test), value);
令人惊讶的是,
parsedValue = 3
因此,在您的情况下,只要您的枚举值不会相互冲突,您就可以确保解析机制正常工作。