asp.net-mvc-4 – 下划线字符串模型绑定器
我的印象是,当绑定到复杂模型时,处理所有公共属性并尝试对每个属性进行匹配绑定.
我正在尝试解决变量命名问题以便建模 class Model { public string Foo {get;set;} public string FooBar {get;set;} } 与查询字符串很好地配合使用 ?foo=foo&foo_bar=foo_bar 有没有比自定义模型绑定器更好的方法?无论如何,我的工作不起作用.简单地跳过了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()); 解决方法
不,这是一个错误的印象.默认模型绑定器将尝试仅绑定在Request中具有相应值的属性.在您的情况下,您没有FooBar属性的相应值,因此它不会被绑定. 实际上,如果我们能写出来会很好: 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); } 和自定义模型绑定器: 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中的自定义模型绑定器替换默认模型绑定器: ModelBinders.Binders.DefaultBinder = new CustomModelBinder(); 现在剩下的就是实现我们用来装饰我们的模型属性的ParameterNameAttribute绑定器: 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 – MVC 4 – 更优雅的方式编辑项目的可变长度列
- asp.net – 有没有理由不将pdb文件部署到生产Web服务器?
- ASP.NET MVC发布模型ID的更好方法是什么?
- 在ASP.NET C#中调用Web服务时,Session为null
- 如何使用ASP.NET MVC增加对AJAX JSON响应的2MB限制
- asp.net – 如何从javascript调用Web服务方法?
- asp.net – 将更改部署到global.asax
- 您认为ASP.NET WebForms是一种不好的做法吗?
- 本地化 – 无法在ASP.Net Core应用程序中设置默认和仅文化
- asp.net-mvc – 如何为最小和最大数量的复选框创建ASP.NET
- asp.net – 使用nginx作为IIS服务器的反向代理
- asp.net-mvc – Visual Studio提示使用Razor语法
- asp.net-mvc-3 – ASP.NET AJAX.BeginForm发送多
- asp.net-mvc-4 – Web.API和FromBody
- 从ASP.NET连接到远程MongoDB实例
- asp.net-mvc – ASP.Net MVC“Magic Strings” –
- asp.net-mvc – Html.Hidden字段未设置
- asp.net c#membership:如何做一个GetUsersInRol
- ASP.NET(.asmx)webservices中的客户端IP地址
- asp.net – 使用Html.TextBox添加css类