0

我成功地制作了 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));

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

4

3 回答 3

2

CallStatus并且CallStatus?是不同的类型。这 ?是语法糖;CallStatus?实际上是 type System.Nullable<CallStatus>

您需要添加另一个活页夹typeof(Nullable<CallStatus>),或使用提供程序,如此所述。

于 2013-01-29T01:03:35.743 回答
1

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

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

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

于 2013-01-29T01:14:46.900 回答
0

你可以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();
}
于 2013-01-29T01:15:33.340 回答