gpt4 book ai didi

asp.net-mvc-4 - 下划线字符串模型 Binder

转载 作者:行者123 更新时间:2023-12-02 05:24:45 29 4
gpt4 key购买 nike

我的印象是,当绑定(bind)到复杂模型时,所有公共(public)属性都会被处理,并尝试为每个属性进行匹配绑定(bind)。

我正在尝试解决变量命名问题,以便模型

class Model {
public string Foo {get;set;}
public string FooBar {get;set;}
}

与像

这样的查询字符串配合得很好
?foo=foo&foo_bar=foo_bar

有没有比自定义模型 Binder 更好的方法?无论如何,我的不起作用。 FooBar 被简单地跳过。

public class StringModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var model = base.BindModel(controllerContext, bindingContext);

if (model != null)
return model;

var modelName = Regex.Replace(bindingContext.ModelName, "([a-z])([A-Z])", "$1_$2").ToLowerInvariant();

var value = bindingContext.ValueProvider.GetValue(modelName);

return value;
}

}

注册

ModelBinders.Binders.Add(typeof(string), new StringModelBinder());

最佳答案

I was under the impression that when binding to a complex model, all public properties were processed and a match binding attempted for each.

不,这是错误的印象。默认模型绑定(bind)器将尝试仅绑定(bind)您在请求中具有相应值的属性。在您的情况下,您没有 FooBar 属性的相应值,因此它不会被绑定(bind)。

实际上,如果我们可以这样写就更好了:

public class Model
{
public string Foo { get; set; }

[ParameterName("foo_bar")]
public string FooBar { get; set; }
}

所以让我们来实现这个。我们首先编写一个基本属性:

[AttributeUsageAttribute(AttributeTargets.Property)]
public abstract class PropertyBinderAttribute : Attribute, IModelBinder
{
public abstract object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext);
}

和自定义模型绑定(bind)器:

public class CustomModelBinder : DefaultModelBinder
{
protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor)
{
var propertyBinderAttribute = propertyDescriptor
.Attributes
.OfType<PropertyBinderAttribute>()
.FirstOrDefault();

if (propertyBinderAttribute != null)
{
var value = propertyBinderAttribute.BindModel(controllerContext, bindingContext);
propertyDescriptor.SetValue(bindingContext.Model, value);
}
else
{
base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
}
}
}

正如您所看到的,此自定义模型分析模型的元数据,如果属性用 PropertyBinderAttribute 实例修饰,它将使用它。

然后,我们将在 Application_Start 中将默认模型绑定(bind)器替换为自定义模型绑定(bind)器:

ModelBinders.Binders.DefaultBinder = new CustomModelBinder();

现在剩下的就是实现我们用来装饰模型属性的 ParameterNameAttribute 绑定(bind)器:

public class ParameterNameAttribute : PropertyBinderAttribute
{
private readonly string parameterName;
public ParameterNameAttribute(string parameterName)
{
this.parameterName = parameterName;
}

public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var value = bindingContext.ValueProvider.GetValue(this.parameterName);
if (value != null)
{
return value.AttemptedValue;
}
return null;
}
}

关于asp.net-mvc-4 - 下划线字符串模型 Binder ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14319552/

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