【问题标题】:.NET MVC C# Enum binder.NET MVC C# 枚举绑定器
【发布时间】:2013-01-29 00:54:47
【问题描述】:

我成功制作了 Enum 活页夹,从 iv 测试结果来看,一切正常。但我想在我的控制器中有可为空的枚举参数,当我更改为可为空时,我的活页夹不起作用。

 public class EnumBinder<T> : IModelBinder
    {
        private object DefaultValue { get; set; }
        public EnumBinder(object defaultValue)
        {
            DefaultValue = defaultValue;
        }


        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            var result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

            if(result == null || string.IsNullOrEmpty(result.AttemptedValue))
            {
                return DefaultValue;
            }

            return GetEnumValue<T>(result.AttemptedValue);
        }



        public static object GetEnumValue<T>(string value)
        {
            var enums = Enum.GetValues(typeof (T)).Cast<T>().ToList();

            foreach (var e in enums)
            {
                var _enum = Enum.Parse(typeof (T), e.ToString());
                if (string.Equals(value, _enum.ToString(), StringComparison.InvariantCultureIgnoreCase))
                {
                    return _enum;
                }
            }

            return null;
        }

    }

适用于

 public virtual ActionResult ControllerName(Status status)
    {
       return View();
    }

但不工作

 public virtual ActionResult ControllerName(Status? status)
    {
       return View();
    }

当然,我已经在应用程序启动时注册了我的活页夹

ModelBinders.Binders.Add(typeof(CallStatus), new EnumBinder<CallStatus>(null));

我做错了什么,为什么我不能在我的控制器中返回可为空的枚举?

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-4 enums


    【解决方案1】:

    CallStatusCallStatus? 是不同的类型。这 ?是语法糖; CallStatus? 实际上是 System.Nullable&lt;CallStatus&gt; 类型。

    您需要为typeof(Nullable&lt;CallStatus&gt;) 添加另一个活页夹,或使用提供程序,如here 所述。

    【讨论】:

    • 我只是为可为空的枚举及其工作分配活页夹,ty :)
    【解决方案2】:

    模型绑定到 Enums 应该只适用于 MVC 3 或 4 中的默认模型绑定器,无论是普通的还是可为空的。

    您是否尝试过使用默认模型绑定器并发现它不起作用?

    IIRC,默认绑定行为取决于枚举值的字符串表示形式。如果您使用的是 html 视图(就像您看起来那样),这应该没问题。如果您使用的是 JSON 或模型的其他表示形式,您可能会遇到枚举在退出时被转换为整数表示的问题,并且如果您需要能够在返回时处理整数值您可能需要一个自定义活页夹。

    【讨论】:

      【解决方案3】:

      你可以为你的枚举设置一个Nullable 类型,因为它是一个值类型。现在在,如果你想把它作为一个可选参数,你必须为你的动作设置一个默认值,例如:

      public virtual ActionResult ControllerName(Status? status = null)
      {
         if (status.HasValue) { /* some logic */ }
         return View();
      }
      

      或者为你的枚举参数类型使用默认值

      public virtual ActionResult ControllerName(Status status = Status.OK)
      {
         /* some logic */
         return View();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-26
        • 1970-01-01
        • 2011-08-28
        相关资源
        最近更新 更多