zoukankan      html  css  js  c++  java
  • ModelBinder、ModelBinderProvider案例

    MVC版

     ModelBinder:参数绑定值

    public class FilterModelBinder : IModelBinder
        {
            public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
            {
                if (bindingContext == null) throw new ArgumentNullException("bindingContext");
                string filter = controllerContext.HttpContext.Request.Form["filter"];
                if (string.IsNullOrEmpty(filter)) return null;
                PromoCodeNewModel_Filter fi = JsonConvert.DeserializeObject<PromoCodeNewModel_Filter>(filter);
                IFilterable t = JsonConvert.DeserializeObject(filter, bindingContext.ModelType) as IFilterable;
                if (t == null) return null;
                if (t.Pager == null)
                {
                    t.Pager = new Pager();
                }
                return t;
            }
            
    
        }

    ModelBinderProvider:如果很多地方需要标注ModelBinder,就适合使用ModelBinderProvider

    public class FilterModelBinderProvider : IModelBinderProvider
        {
            public System.Web.Mvc.IModelBinder GetBinder(Type modelType)
            {
                if (typeof(IFilterable).IsAssignableFrom(modelType))
                {
                    return new FilterModelBinder();
                }
                return null;
            }
        }

    Core版

    ModelBinderProvider:

        /// <summary>
        /// An <see cref="IModelBinderProvider"/> for deserializing the request body using a formatter.
        /// </summary>
        public class FilterModelBinderProvider : IModelBinderProvider
        {
            private readonly IList<IInputFormatter> formatters;
            private readonly IHttpRequestStreamReaderFactory readerFactory;
    
            public FilterModelBinderProvider(IList<IInputFormatter> formatters, IHttpRequestStreamReaderFactory readerFactory)
            {
                this.formatters = formatters;
                this.readerFactory = readerFactory;
            }
            /// <inheritdoc />
            public IModelBinder GetBinder(ModelBinderProviderContext context)
            {
                if (typeof(IFilterable).IsAssignableFrom(context.Metadata.ModelType))
                    return new FilterModelBinder(formatters, readerFactory);
                return null;
            }
        }
    View Code

    ModelBinder:

      /// <summary>
        /// An <see cref="IModelBinder"/> which binds models from the request body using an <see cref="IInputFormatter"/>
        /// when a model has the binding source <see cref="BindingSource.Body"/>.
        /// </summary>
        public class FilterModelBinder : IModelBinder
        {
            private readonly IList<IInputFormatter> formatters;
            private readonly IHttpRequestStreamReaderFactory readerFactory;
            public FilterModelBinder(IList<IInputFormatter> formatters, IHttpRequestStreamReaderFactory readerFactory)
            {
                this.formatters = formatters;
                this.readerFactory = readerFactory;
            }
            /// <inheritdoc />
            public async Task BindModelAsync(ModelBindingContext bindingContext)
            {
                await Task.Run(() =>
                {
                    if (bindingContext == null) throw new ArgumentNullException("bindingContext");
                    string filter = bindingContext.HttpContext.Request.Form["filter"];
                    if (string.IsNullOrEmpty(filter)) return;
                    IFilterable t = JsonConvert.DeserializeObject(filter, bindingContext.ModelType) as IFilterable;
                    if (t == null) return;
                    if (t.Pager == null)
                    {
                        t.Pager = new Pager();
                    }
                    bindingContext.Result = ModelBindingResult.Success(t);
                });
            }
        }
    
        /// <summary>
        /// An <see cref="IModelBinderProvider"/> for deserializing the request body using a formatter.
        /// </summary>
        public class FilterModelBinderProvider : IModelBinderProvider
        {
            private readonly IList<IInputFormatter> formatters;
            private readonly IHttpRequestStreamReaderFactory readerFactory;
    
            public FilterModelBinderProvider(IList<IInputFormatter> formatters, IHttpRequestStreamReaderFactory readerFactory)
            {
                this.formatters = formatters;
                this.readerFactory = readerFactory;
            }
            /// <inheritdoc />
            public IModelBinder GetBinder(ModelBinderProviderContext context)
            {
                if (typeof(IFilterable).IsAssignableFrom(context.Metadata.ModelType))
                    return new FilterModelBinder(formatters, readerFactory);
                return null;
            }
        }
    View Code

     使用ModelBinder:

     public IActionResult ListData([ModelBinder(typeof(FilterModelBinder))]ActiveList_Filter filter) {} 

    未完待续...

      
  • 相关阅读:
    Servlet页面跳转实现方法的区别
    谈JSP与XML的交互
    xml可以用做什么?
    Struts1.2入门知识
    做java web 开发的简单项目必须具备的知识
    Web工程师必备的18款工具
    css的四种调用方式
    jQuery Utilities
    历年考研数学常考题型考试必备
    。net思维导图
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/12111563.html
Copyright © 2011-2022 走看看