来自FormCollection的Enum.Parse

时间:2014-02-07 20:50:56

标签: c# asp.net-mvc

我有一个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);
            }
        }
        // ...
    }
}

1 个答案:

答案 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

因此,在您的情况下,只要您的枚举值不会相互冲突,您就可以确保解析机制正常工作。