gpt4 book ai didi

c# - Enum.Parse 来自 FormCollection

转载 作者:太空宇宙 更新时间:2023-11-03 16:00:36 25 4
gpt4 key购买 nike

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

最佳答案

我猜这种行为是由于添加到枚举中的一个名为 Flag 的功能所致;就我而言,您可以拥有一个具有多个对应名称的枚举值。采取以下示例:

     public enum Test
{
A = 1,
B = 2,
C = 4
}

var value = "A,B";
var parsedValue = Enum.Parse(typeof (Test), value);

令人惊讶的是,

       parsedValue = 3

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

关于c# - Enum.Parse 来自 FormCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21637502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com