MVC Core的自定义模型绑定IModelBinder

本文详细介绍了在.NET Framework MVC5与.NET Core下自定义ModelBinder的不同方式。在MVC5中,通过继承DefaultModelBinder并重写BindModel方法;而在.NET Core中,则需创建自己的DefaultModelBinder类,重写BindModelAsync,并通过IModelBinderProvider注册。文章提供了具体代码实例,展示了如何在实体类或方法参数上应用自定义ModelBinder。

在.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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值