C# Enum.Parse From FormCollection
我有一个MVC4积垢表。该模型具有类型为枚举的属性MyProp:C# Enum.Parse From FormCollection,c#,asp.net-mvc,C#,Asp.net Mvc,我有一个MVC4积垢表。该模型具有类型为枚举的属性MyProp: public enum MyType { Item1, Item2 } 我认为: @Html.DropDownListFor(model => model.MyProp, typeof(MyType).ToSelectList(), new { onchange="copyToHidden('MyType');" }) @Html.HiddenFor(model => model.MyProp) c
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.ParseItem1,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);
}
}
// ...
}
}
我猜这种行为是由于添加到枚举中的一个功能,名为;就我所知,您可以拥有一个枚举值和多个对应的名称。以以下样本为例:
public enum Test
{
A = 1,
B = 2,
C = 4
}
var value = "A,B";
var parsedValue = Enum.Parse(typeof (Test), value);
令人惊讶的是
parsedValue = 3
因此,在您的情况下,只要您的枚举值彼此不冲突,您就可以确保解析机制正常工作。我们无法告诉您某些代码的英文描述是否始终有效。你必须发布你要问的代码。否则我们只能猜测。你为什么要自己写这篇文章?这就是ModelBinder所做的。。。只需将您的函数公开ActionResult CreateMyModel,它就会自动为您设置属性!我自己写这篇文章是因为有些情况下我不能使用ModelBinder,例如在多模型创建页面中。