C# Enum.Parse From FormCollection

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

我有一个MVC4积垢表。该模型具有类型为枚举的属性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.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,例如在多模型创建页面中。