上一篇主要讲解了如何利用ActionFilter过滤关键字,这篇主要讲解如何利用自己打造的ModelBinder来过滤关键字。

首先,我们还是利用上一篇中的实体类,但是我们需要加上DataType特性,以便于我们构造的ModelBinder通过DataTypeName识别出来:

   1:  using System.ComponentModel.DataAnnotations;
   2:  using System.Web.Mvc;
   3:   
   4:  namespace MvcApplication1.Models
   5:  {
   6:      public class TestModel
   7:      {
   8:          public int TID { get; set; }
   9:   
  10:          [DataType("TName")]
  11:          public string TName { get; set; }
  12:   
  13:          [DataType("TSite")]
  14:          public string TSite { get; set; }
  15:      }
  16:  }

然后我们新建一个FilterModelBinder的类,其中内容如下:

   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Web;
   5:  using System.Web.Mvc;
   6:   
   7:  namespace MvcApplication1
   8:  {
   9:      public class FilterModelBinder:DefaultModelBinder
  10:      {
  11:          public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
  12:          {
  13:              var valueShouldFilter = bindingContext.ModelMetadata.DataTypeName;
  14:              if (valueShouldFilter == "TName" || valueShouldFilter == "TSite")
  15:              {
  16:                  var resultProvider = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
  17:                  if (resultProvider != null)
  18:                  {
  19:                      string result = resultProvider.AttemptedValue;
  20:                      result = result.Replace("<", "&lt;").Replace(">", "&gt;");
  21:                      return result;
  22:                  }
  23:              }
  24:   
  25:              return base.BindModel(controllerContext, bindingContext);
  26:          }
  27:      }
  28:  }

第13行,主要是获取我们需要验证的DataTypeName.

第15行,获取需要验证的值,然后替换,最后返回即可.

上面做完后,在Global.asax中,我们需要指定一下:

   1:  protected void Application_Start()
   2:          {
   3:              AreaRegistration.RegisterAllAreas();
   4:   
   5:              WebApiConfig.Register(GlobalConfiguration.Configuration);
   6:              FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
   7:              RouteConfig.RegisterRoutes(RouteTable.Routes);
   8:              BundleConfig.RegisterBundles(BundleTable.Bundles);
   9:   
  10:              ModelBinders.Binders.DefaultBinder = new FilterModelBinder();
  11:          }

这样,我们就能使用我们自己的ModelBinder了,下面开始测试:

我们输入的内容如上图所示,当点击”添加”按钮的时候,确弹出如下的错误提示:

看来,系统会自动检测我们的输入值,发现有非法字符,会弹出错误提示,还好我们可以通过web.config配置一下,让其通过验证:

打开最外层的Web.config,输入以下节点:

   1:  <configuration>
   2:    <system.web>
   3:     <httpRuntime requestValidationMode="2.0" />
   4:    </system.web>
   5:    <pages validateRequest="false">
   6:    </pages>
   7:  </configuration>

然后保存,运行,我们看到,系统成功跑了起来,最后的结果如下:

我们可以看到,通过我们自定义的ModelBinder,系统自动将非法字符进行了替换,非常方便。

MVC中处处AOP,现在我们就可以利用现有的知识做一个全局过滤器了。是不是感觉很方便呢?

百度网盘源代码下载

微云源代码下载

2014.04.26更新

由于上面的例子不能体现其通用性,毕竟我们定义了一个TSite的datatype和一个TName的datatype。

其实我们完全可以给需要过滤的字段加上一个 [DataType("ShouldBeFilter")]的定义,这样无论是什么实体,只要包含了这个定义,都可以被过滤掉关键字了:

实体类定义:

 public class TestModel
    {
        public int TID { get; set; }

        [DataType("ShouldBeFilter")]
        public string TName { get; set; }

        [DataType("ShouldBeFilter")]
        public string TSite { get; set; }
    }

通用过滤方法:

using System.Web.Mvc;

namespace MvcApplication1
{
    public class FilterModelBinder:DefaultModelBinder
    {
        public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            var valueShouldFilter = bindingContext.ModelMetadata.DataTypeName;
            if (valueShouldFilter == "ShouldBeFilter")
            {
                var resultProvider = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
                if (resultProvider != null)
                {
                    string result = resultProvider.AttemptedValue;
                    result = result.Replace("<", "<").Replace(">", ">");
                    return result;
                }
            }

            return base.BindModel(controllerContext, bindingContext);
        }
    }
}

MVC中利用自定义的ModelBinder过滤关键字的更多相关文章

  1. Asp.net Mvc中利用ValidationAttribute实现xss过滤

    在网站开发中,需要注意的一个问题就是防范XSS攻击,Asp.net mvc中已经自动为我们提供了这个功能.用户提交数据时时,在生成Action参数的过程中asp.net会对用户提交的数据进行验证,一旦 ...

  2. MVC中利用ActionFilterAttribute过滤关键字

    在开发过程中,有时候会对用户输入进行过滤,以便保证平台的安全性.屏蔽的方法有很多种,但是今天我说的这种主要是利用MVC中的ActionFilterAttribute属性来实现.由于MVC天然支持AOP ...

  3. ASP.NET MVC中利用AuthorizeAttribute实现访问身份是否合法以及Cookie过期问题的处理

    话说来到上海已经快半年了,时光如白驹过隙,稍微不注意,时间就溜走了,倒是没有那么忙碌,闲暇之际来博客园还是比较多的,记得上次在逛博问的时候看到有同志在问MVC中Cookie过期后如何作相关处理,他在阐 ...

  4. mpi中利用自定义归约操作实现merge

    在归并排序中,很重要的一步是将两个排序数组合并成一个数组,这个操作叫merge.merge操作可以用来解决某些Top K问题. 问题描述 在哼唱搜索中,用户通过哼唱一个音乐片段去搜索与其相似的音乐.后 ...

  5. MVC中利用knockout.js实现动态uniqueId

    题目比较拗口,但是这篇文章确实直说这一点. knockout.js是一个JS库,它的官网是http://knockoutjs.com/ 这篇文章的重点是knockout在工作的一个功能中的应用.最终效 ...

  6. asp.net mvc 中的自定义验证(Custom Validation Attribute)

    前言

  7. asp.net mvc 5 利用ActionFilterAttribute实现权限过滤

    关于c#属性的教程:http://www.runoob.com/csharp/csharp-attribute.html 在asp.net mvc5中,可以利用ActionFilterAttribut ...

  8. 怎么在MVC中使用自定义Membership

    首先我们来看看微软自带的membership: 我们打开系统下aspnet_regsql.exe 地址一般位于: C:\WINDOWS\Microsoft.NET\Framework\v2.0.507 ...

  9. [转]怎么在MVC中使用自定义Membership

    本文转自:http://www.cnblogs.com/angelasp/p/4078244.html 首先我们来看看微软自带的membership: 我们打开系统下aspnet_regsql.exe ...

随机推荐

  1. Arduino学习经验(一)之解决舵机库和pwm输出冲突

    一.前言 最近在公司学习Arduino uno ,用它实现小车超声波避障功能.实现的功能很简单,就是在小车前方挂一个超声波模块,当碰到障碍物时,会通过舵机进行摆头,判断两边的距离,进行左右转弯.但是碰 ...

  2. Html_Img元素 设置图片与其他元素横排高度一致

    <img id="numAdd" src="~/Images/jia.jpg" style="width:30px;height:30px;ve ...

  3. 《c语言全局变量的用法》

    //全局变量的用法. /*有一个一维数组,内放n个学生的成绩,(n由用户自己指定,通过调用函数实现定义一个数组.)写一个函数,当主函数调用此函数后,能求出平均分,最高分,最低分.*/ #include ...

  4. Java面试题之十

    五十六.java中有几种类型的流?JDK 为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? 主要有字节流,字符流.字节流继承于InputStream .OutputStream,字符流 ...

  5. Ice_cream&#39;s world I--hdu2120

    Ice_cream's world I Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  6. FZU 2087 统计树边

    这题第一直觉就是和CF第三次教育场的E题是一样的, http://codeforces.com/contest/609/problem/E 然后直接拉过来代码改了改,提交返回MLE.FZU内存开的小, ...

  7. django rest framework serializers序列化

    serializers是将复杂的数据结构变成json或者xml这个格式的 serializers有以下几个作用: - 将queryset与model实例等进行序列化,转化成json格式,返回给用户(a ...

  8. PHP批量保存图片到服务器再上传阿里云

    /* * 批量传输产品主图到阿里云 */ public function transferImage(){ $num = 50; $p = isset($this->request->ge ...

  9. 论坛:设计实体--&gt;分析功能--&gt;实现功能 之 《分析功能》

    其中 管理文章 的功能没有做,以下做的设计 浏览与参与 功能的步骤 分析功能   5个功能.   7个请求. 实现功能   Action, 7个方法   Service   Dao   Jsp For ...

  10. Breaseman算法绘制圆形|中点算法绘制圆形_程序片段

    Breaseman算法绘制圆形|中点算法绘制圆形_程序片段 1. Breaseman算法绘制圆形程序 由于算法的特殊性,限制绘制第一象限部分,其他部分通过旋转绘制. void CCGProjectWo ...