繁体   English   中英

从FormCollection枚举

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM