ASP.NETMVC 3中的模型绑定如何实现?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

我有一个方法在我的控制器接受一个对象作为参数并返回一个JsonResult。此对象的其中一个属性是具有三个可能值的枚举。我认为,当客户端传递给该属性的int时,它将填充枚举,但它不会,默认为0,并且枚举被设置为第一个可能的选择。

有什么建议么?

提问于
用户回答回答于

注意:这已经在MVC 4中解决了。如果升级到MVC 4是您的项目的可行选项,那么只需开始将模型绑定到枚举即可。

这就是说,如果你仍然需要MVC 3,这里是解决方法。

问题在于MVC中的默认模型联编程序。正确的整数值使其成为模型联编程序,但联编程序未编码为映射到枚举的整数值。如果传入的值是包含枚举的命名值的字符串,则它会正确绑定。这样做的问题是,当使用该Json()方法将C#对象解析为JSON时,它会将整数值作为枚举值发送,而不是命名值。

对此的最简单和最透明的解决方案是覆盖默认的模型绑定器并编写一些自定义逻辑来修复绑定枚举的方式。

  1. 创建一个新的类,就像这样。 namespace CustomModelBinders { /// <summary> /// Override for DefaultModelBinder in order to implement fixes to its behavior. /// This model binder inherits from the default model binder. All this does is override the default one, /// check if the property is an enum, if so then use custom binding logic to correctly map the enum. If not, /// we simply invoke the base model binder (DefaultModelBinder) and let it continue binding as normal. /// </summary> public class EnumModelBinder : DefaultModelBinder { /// <summary> /// Fix for the default model binder's failure to decode enum types when binding to JSON. /// </summary> protected override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder) { var propertyType = propertyDescriptor.PropertyType; if (propertyType.IsEnum) { var providerValue = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); if (null != providerValue) { var value = providerValue.RawValue; if (null != value) { var valueType = value.GetType(); if (!valueType.IsEnum) { return Enum.ToObject(propertyType, value); } } } } return base.GetPropertyValue(controllerContext, bindingContext, propertyDescriptor, propertyBinder); } } }
  2. 然后只需在Global.asax文件中注册它。 protected override void OnApplicationStarted() { base.OnApplicationStarted(); AreaRegistration.RegisterAllAreas(); RegisterRoutes(RouteTable.Routes); // Register your new model binder ModelBinders.Binders.DefaultBinder = new EnumModelBinder(); }

而已。枚举现在将被正确绑定在JSON对象上。

http://www.codetunnel.com/how-to-bind-to-enums-on-json-objects-in-aspnet-mvc-3

用户回答回答于

绑定到模型上的钩子属性如何?

public class SomeModel
{
   public MyEnum EnumValue { get; set; }
   public int BindToThisGuy
   {
      get { return (int) EnumValue; }
      set { EnumValue = (MyEnum)value; }
   }
}

扫码关注云+社区