在.net framework时MVC5下我们自定义模型绑定是继承DefaultModelBinder来重写BindModel实现的
如代码:
/*
* 描述:自定义ModelBinder进行字符串输入的处理去空格
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MyMis.MvcHelper {
public class StringModelBinder:DefaultModelBinder {
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) {
object value = base.BindModel(controllerContext, bindingContext);
//处理string类型数据
if (value is string) {
string strValue = (string)value;
string newValue = strValue.Trim();
return newValue;
}
else {
return value;
}
}
}
}
然后在Global文件中注册下
//对自定义的ModelBinder进行
ModelBinders.Binders.Add(typeof(string), new StringModelBinder());
但是在.net core下使用的方式却变了,差别还是有点的。
mvc core没有提供对应的类DefaultModelBinder让我们来继承重写,所以只有自己创建了
1.创建DefaultModelBinder类以供其他自定义的方法来继承,重写BindModelAsync
using Microsoft.AspNetCore.Mvc.ModelBinding;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace MyMis.Web.MvcHelper {
public class DefaultModelBinder : IModelBinder {
public virtual Task BindModelAsync(ModelBindingContext bindingContext) {
var modelName = bindingContext.ModelName;
//根据名称获取传递的值
ValueProviderResult ValueResult = bindingContext.ValueProvider.GetValue(modelName);
//从请求的参数集合中,拿到第一个参数
string value = ValueResult.FirstValue;
bindingContext.Result = ModelBindingResult.Success(value);
return Task.CompletedTask;
}
}
}
2.实现StringModelBinder通过继承刚才的DefaultModelBinder重写BindModelAsync来实现,如果要实现NumberModelBinder方法也一样,继承后重写就行了
/*
* 描述:自定义ModelBinder进行字符串输入的处理去空格
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MyMis.MvcHelper {
public class StringModelBinder:DefaultModelBinder {
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) {
object value = base.BindModel(controllerContext, bindingContext);
//处理string类型数据
if (value is string) {
string strValue = (string)value;
string newValue = strValue.Trim();
return newValue;
}
else {
return value;
}
}
}
}
3.在mvc core下注册需要实现IModelBinderProvider才可以,这跟mvc 5又有了很大的不同,我们需要自己来实现此代码
using Microsoft.AspNetCore.Mvc.ModelBinding;
using MyMis.MvcHelper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace MyMis.Web.MvcHelper {
public class ModelBinderProvider : IModelBinderProvider {
public IModelBinder GetBinder(ModelBinderProviderContext context) {
if (context.Metadata.ModelType == typeof(string)) {
return new StringModelBinder();
}
else if (context.Metadata.ModelType == typeof(int)) {
return new NumberModelBinder();
}
return null;
}
}
}
代码时候好后,如何来使用呢,我们需要注册下
services.AddMvc(m=> {
//注册到集合的第一个
m.ModelBinderProviders.Insert(0, new ModelBinderProvider());
});
这样就可以使用了,当然也有其他方法来注册实现,如在在实体类头上加入特性
[ModelBinder(BinderType = typeof(StringModelBinder))]
[ModelBinder(BinderType = typeof(StringModelBinder))]
public class Userinfo
{
public int id { get; set; }
public string name { get; set; }
}
还可以在方法参数上加上特性[ModelBinder(BinderType = typeof(StringModelBinder))]
public IActionResult Index([ModelBinder(BinderType = typeof(StringModelBinder))]Userinfo info)
{
}
参考:
https://docs.microsoft.com/zh-cn/aspnet/core/mvc/advanced/custom-model-binding?view=aspnetcore-3.1
https://blog.csdn.net/weixin_43458389/article/details/88619558