zoukankan      html  css  js  c++  java
  • ASP.NET MVC:如何提供 Controller 继承体系使用的 ModelBinder?

    背景

    Mvc 提供了一种可扩展的模型绑定机制,具体来说就是:将客户端传递的参数按照一定的策略绑定到 action 的参数上,这带来的直接好处就是让 action 的参数支持强类型。一般来说我们有如下方式使用模型的绑定特性:

    • 按照约定。
    • 自定义一个 IModelBinder,然后将其应用到需要的参数上。
    • 自定义一个 IModelBinder,然后将其应用到指定的 Controller 上(不支持继承)。
    • 自定义一个 IModelBinder,然后将其注册到 ModelBinders.Binders 中(影响全局)。
    • 自定义一个 IModelBinder,然后将其注册到 ModelBinders.Binders.DefaultBinder 中(影响全局)。

    有一点让我意外的是,在 Controller 的实例方法中可以访问:this.Binders,这让我以为可以提供 Controller 继承体系级别的模型绑定机制,最后发现 this.Binders 也是全局配置。下文说一下如何提供 Controller 继承体系使用的 ModelBinder。

    直接看代码

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 using System.Web.Mvc;
     7 
     8 namespace Happy.Web.Mvc
     9 {
    10     /// <summary>
    11     /// 提供控制器级别的默认 ModelBinder。
    12     /// </summary>
    13     public sealed class HappyModelBinder : IModelBinder
    14     {
    15         private static readonly DefaultModelBinder _defaultModelBinder = new DefaultModelBinder();
    16 
    17         /// <inheritdoc />
    18         public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    19         {
    20             var supportDefaultModelBinder = controllerContext.Controller as ISupportDefaultModelBinder;
    21             if (supportDefaultModelBinder != null && supportDefaultModelBinder.DefaultModelBinder != null)
    22             {
    23                 return supportDefaultModelBinder.DefaultModelBinder.BindModel(controllerContext, bindingContext);
    24             }
    25 
    26             return _defaultModelBinder.BindModel(controllerContext, bindingContext);
    27         }
    28     }
    29 }

    将上面的 ModelBinder 设置为 DefaultBinder 就行了。 

  • 相关阅读:
    Qt QChart 中 QValueAxis 和 QCategoryAxis 区别
    Qt QChart 绘制面积图 QAreaSeries
    Qt QChart 设置线条样式 虚线
    Qt 读取csv文件并且绘制折线图
    Qt comboBox控件的三种基本用法
    Qt QStringList 的学习笔记
    OpenYurt 联手 eKuiper,解决 IoT 场景下边缘流数据处理难题
    如何避免 Go 命令行执行产生“孤儿”进程?
    阿里巴巴代码平台架构的演进之路
    云原生演进趋势下传统数据库升级实践
  • 原文地址:https://www.cnblogs.com/happyframework/p/3532347.html
Copyright © 2011-2022 走看看