[英]Enum.Parse From FormCollection
我有一个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);
}
}
// ...
}
}
我猜这种现象是由于添加到Enums中的称为Flag的功能引起的; 就我而言,您可以使用一个具有多个对应名称的枚举值。 采取以下示例:
public enum Test
{
A = 1,
B = 2,
C = 4
}
var value = "A,B";
var parsedValue = Enum.Parse(typeof (Test), value);
令人惊讶的是
parsedValue = 3
因此,在您的情况下,只要您的枚举值彼此不冲突,就可以确保解析机制正常运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.