MVC Core的自定义模型绑定IModelBinder

18 篇文章 1 订阅

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值