經常需要對使用者輸入的資料在插入資料庫或者判斷之前做Trim處理, 針對每個ViewModel的欄位各自做處理是我們一般的想法。 最近調查發現其實也可以一次性實現的。
MVC4.6中實現方式
1, 實現IModelBinder介面,創建自訂ModelBinder。
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的綁定庫。
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
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
public class TrimModelBinderProvider : IModelBinderProvider { public IModelBinder GetBinder(ModelBinderProviderContext context) { if (context.Metadata.IsComplexType && !context.Metadata.IsCollectionType) { var propertyBinders = new Dictionary; for (int i = 0; i3,將Provider添加到綁定管理庫
services.AddMvc.AddMvcOptions(s => { s.ModelBinderProviders[s.ModelBinderProviders.TakeWhile(p => !(p is ComplexTypeModelBinderProvider)).Count()] = new TrimModelBinderProvider; });4,確認一下效果
將密碼後面的空格做Trim處理, 綁定到ViewModel的時候變成1了:
總結
就是這麼簡單,為以後做備忘.