ASP.NET MVC IModelBinder应用

ASP.NET MVC5  暂时找到这种全局性的解决方案   参考 MVC项目开发中那些用到的知识点(MVC IModelBinder)

事情的起因

利用jQuery $.ajax作POST提交, 对发送参数在B端做了 escape(item.value.HTMLEncode()) ,所以在C端对接收到参数要做 UrlDecode();  势必在action接收modle时有大量的重复性冗余代码,如下面

public string Create(tbiz_movieEntity movie)
{
    if (ModelState.IsValid)
    {
        tbiz_movieBLL movieBLL = new tbiz_movieBLL();
        movie.MovieFileName = movie.MovieFileName.UrlDecode(); //HttpUtility.HtmlDecode(movie.MovieFileName);
        movie.MovieName = movie.MovieName.UrlDecode();
        movie.CreateTime = DateTime.Now;
        movieBLL.Addtbiz_movieEntity(movie);

使用自定义IModelBinder类进行解决

ModelsCustomBinder.cs
public class CustomBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        object obj = Activator.CreateInstance(bindingContext.ModelType);
        foreach (PropertyInfo p in bindingContext.ModelType.GetProperties())
        {
            ValueProviderResult vpResult = bindingContext.ValueProvider.GetValue(p.Name);
            if (vpResult != null)
            {
                object value = vpResult.ConvertTo(p.PropertyType);
                if (value.ToString().IndexOf("%") > -1 && value.GetType() == typeof(string))
                {
                    object decodeVal = value.ToString().UrlDecode();
                    p.SetValue(obj, decodeVal, null);
                }
                else
                {
                     p.SetValue(obj, value, null);
                }
                
            }
        }
        return obj;
    }
}

代码重构

[HttpPost]
public string Create([ModelBinder(typeof(CustomBinder))]tbiz_movieEntity movie)
原文地址:https://www.cnblogs.com/zhuji/p/13902817.html