MVC中利用自定义的ModelBinder过滤关键字
上一篇主要讲解了如何利用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("<", "<").Replace(">", ">");
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过滤关键字的更多相关文章
- Asp.net Mvc中利用ValidationAttribute实现xss过滤
在网站开发中,需要注意的一个问题就是防范XSS攻击,Asp.net mvc中已经自动为我们提供了这个功能.用户提交数据时时,在生成Action参数的过程中asp.net会对用户提交的数据进行验证,一旦 ...
- MVC中利用ActionFilterAttribute过滤关键字
在开发过程中,有时候会对用户输入进行过滤,以便保证平台的安全性.屏蔽的方法有很多种,但是今天我说的这种主要是利用MVC中的ActionFilterAttribute属性来实现.由于MVC天然支持AOP ...
- ASP.NET MVC中利用AuthorizeAttribute实现访问身份是否合法以及Cookie过期问题的处理
话说来到上海已经快半年了,时光如白驹过隙,稍微不注意,时间就溜走了,倒是没有那么忙碌,闲暇之际来博客园还是比较多的,记得上次在逛博问的时候看到有同志在问MVC中Cookie过期后如何作相关处理,他在阐 ...
- mpi中利用自定义归约操作实现merge
在归并排序中,很重要的一步是将两个排序数组合并成一个数组,这个操作叫merge.merge操作可以用来解决某些Top K问题. 问题描述 在哼唱搜索中,用户通过哼唱一个音乐片段去搜索与其相似的音乐.后 ...
- MVC中利用knockout.js实现动态uniqueId
题目比较拗口,但是这篇文章确实直说这一点. knockout.js是一个JS库,它的官网是http://knockoutjs.com/ 这篇文章的重点是knockout在工作的一个功能中的应用.最终效 ...
- asp.net mvc 中的自定义验证(Custom Validation Attribute)
前言
- asp.net mvc 5 利用ActionFilterAttribute实现权限过滤
关于c#属性的教程:http://www.runoob.com/csharp/csharp-attribute.html 在asp.net mvc5中,可以利用ActionFilterAttribut ...
- 怎么在MVC中使用自定义Membership
首先我们来看看微软自带的membership: 我们打开系统下aspnet_regsql.exe 地址一般位于: C:\WINDOWS\Microsoft.NET\Framework\v2.0.507 ...
- [转]怎么在MVC中使用自定义Membership
本文转自:http://www.cnblogs.com/angelasp/p/4078244.html 首先我们来看看微软自带的membership: 我们打开系统下aspnet_regsql.exe ...
随机推荐
- 【原】log4cplus使用说明
网上关于开源日志工具log4cplus的说明有很多,但大多略显复杂,本文主要从实用的角度,介绍一种最简单而且又实用的方法.本文的方法已经足够满足实际工程中的使用需求,而且不需要很复杂的流程,可以实现. ...
- iOS网络-02-数据解析(JSON与XML)
数据交互格式 服务器返回给用户的数据,通常是以下两种方式: JSON XML JSON 一种轻量级的数据数据格式,体积比XML小,是服务器返回给移动端通常采用的格式 用使用JSON文件中的数据,需要对 ...
- linux路由表命令
转自此大神http://www.cnblogs.com/gunl/archive/2010/09/14/1826234.html 留在好查阅 linux 路由表维护 查看 Linux 内核路由表 使用 ...
- 剔除editor编辑器中的HTML标签
1.剔除editor编辑器中的HTML标签 public static string striphtml(string strhtml) { string stroutput = ...
- nodejs创建一个HTTP服务器 简单入门级
const http = require('http');//请求http.createServer(function(request, response){ /*createServer该函数 ...
- SQL Server 2008 R2——VC++ ADO 操作 存储过程
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
- spring提供的解决中文乱码方案
在表单提交时,如果遇到中文符号会出现乱码问题. Spring提供一个CharacterEncodingFilter过滤器,可用于解决乱码问题. CharacterEncodingFilter使用的时候 ...
- Set a static file on django
1. In setting file: ROOT_PATH='/home/ronglian/project/taskschedule' STATIC_URL = '/static/' STATICFI ...
- JVM相关问答
大部分内容来源网络,整理一下,留个底. 问:堆和栈有什么区别? 答:堆是存放对象的,但是对象内的临时变量是存在栈内存中,如例子中的methodVar是在运行期存放到栈中的. 栈是跟随线程的,有线程就有 ...
- 我是如何来做网站优化(Seo)的?(二)
在上一篇文章<我是如何来做网站优化(Seo)的?(一)>讲述了网站优化几个注意项目. 在我们日常网站维护中,难免会使用到各种工具,文章的第二节我们就来讲讲这些工具. 网站提交通道 百度站长 ...