经常需要对用户输入的数据在插入数据库或者判断之前做Trim处理,针对每个ViewModel的字段各自做处理是我们一般的想法。最近调查发现其实也可以一次性实现的。
MVC4.6中实现方式
1,实现IModelBinder接口,创建自定义ModelBinder。
1 2 3 4 5 6 7 8 9 10 | public class TrimModelBinder : IModelBinder { public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); string attemptedValue = valueResult?.AttemptedValue; return string .IsNullOrWhiteSpace(attemptedValue) ? attemptedValue : attemptedValue.Trim(); } } |
2,添加ModelBinder到MVC的绑定库。
1 2 3 4 5 6 7 8 9 10 | protected void Application_Start() { //System.Web.Mvc.ModelBinders.Binders.DefaultBinder = new ModelBinders.TrimModelBinder(); System.Web.Mvc.ModelBinders.Binders.Add( typeof ( string ), new ModelBinders.TrimModelBinder()); AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); } |
3,确认一下效果
将密码后面的空格做Trim处理,绑定到ViewModel的时候变成1了:
Asp.net core 1.1 MVC中实现方式
1,自定义ModelBinder并继承ComplexTypeModelBinder
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class TrimModelBinder : ComplexTypeModelBinder { public TrimModelBinder(IDictionary propertyBinders) : base (propertyBinders) { } protected override void SetProperty(ModelBindingContext bindingContext, string modelName, ModelMetadata propertyMetadata, ModelBindingResult result) { var value = result.Model as string ; result= string .IsNullOrWhiteSpace(value) ? result : ModelBindingResult.Success(value.Trim()); base .SetProperty(bindingContext, modelName, propertyMetadata, result); } } |
2,为ModelBinder添加自定义Provider
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public class TrimModelBinderProvider : IModelBinderProvider { public IModelBinder GetBinder(ModelBinderProviderContext context) { if (context.Metadata.IsComplexType && !context.Metadata.IsCollectionType) { var propertyBinders = new Dictionary(); for ( int i = 0; i < context.Metadata.Properties.Count; i++) { var property = context.Metadata.Properties[i]; propertyBinders.Add(property, context.CreateBinder(property)); } return new TrimModelBinder(propertyBinders); } return null ; } } |
3,将Provider添加到绑定管理库
1 2 3 4 | services.AddMvc().AddMvcOptions(s => { s.ModelBinderProviders[s.ModelBinderProviders.TakeWhile(p => !(p is ComplexTypeModelBinderProvider)).Count()] = new TrimModelBinderProvider(); }); |
4,确认一下效果
将密码后面的空格做Trim处理,绑定到ViewModel的时候变成1了:
总结
就是这么简单,为以后做备忘.
每天成就一小步,积累下来就是一大步。
转发本文请注明出处,谢谢您的阅读与分享!
分类:
ASP.NET MVC技术
, C#.NET
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下