【问题标题】:Case Insensitive Model Binding MVC 4不区分大小写的模型绑定 MVC 4
【发布时间】:2013-11-02 23:37:33
【问题描述】:

我希望我的模型绑定不区分大小写。

我尝试操作从 System.web.Mvc.DefaultModelBinder 继承的自定义模型绑定器,但我不知道在哪里添加不区分大小写。

我也看了IValueProvider,但我不想重新发明轮子并自己找到价值。

有什么想法吗?

【问题讨论】:

  • 我认为DefaultModelBinder 已经是案例密集型了?你能在看起来区分大小写的地方显示代码吗?
  • 其实我也是。我不知道我做了什么,但这不是它现在的行为方式。
  • 那你想做什么?
  • 我有一个对象,其属性的第一个字母是大写的。我将其序列化并在 http POST 中将其发送到 mvc 控制器。 mvc 控制器中的操作试图将其绑定到类似的模型,但首字母小写。它曾经可以正常工作,但经过一些重度重构(显然不相关)后,它就不行了。准确地说,它适用于 POST,但不适用于 PUT。而且,这仍然取决于属性。有些可以很好地反序列化,而其他(例如“idOrder”)则不是。

标签: asp.net-mvc asp.net-mvc-4 model-binding custom-model-binder value-provider


【解决方案1】:

拥有CustomModelBinder 是解决方案。因为我不需要完全不区分大小写,所以我只检查是否找到了我的属性的小写版本。

public class CustomModelBinder : DefaultModelBinder
{
    protected override void SetProperty(ControllerContext controllerContext, 
                                        ModelBindingContext bindingContext, 
                                        PropertyDescriptor propertyDescriptor, 
                                        object value)
    {
        //only needed if the case was different, in which case value == null
        if (value == null)
        {
            // this does not completely solve the problem, 
            // but was sufficient in my case
            value = bindingContext.ValueProvider.GetValue(
                        bindingContext.ModelName + propertyDescriptor.Name.ToLower());
            var vpr = value as ValueProviderResult;
            if (vpr != null)
            {
                value = vpr.ConvertTo(propertyDescriptor.PropertyType);
            }
        }
        base.SetProperty(controllerContext, bindingContext, propertyDescriptor, value);
    }
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
  • 2014-08-08
  • 2016-08-29
  • 2022-01-25
  • 2019-07-01
  • 2020-03-03
  • 1970-01-01
相关资源
最近更新 更多