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 ...
随机推荐
- Unity3D事件函数的执行顺序 - 包含渲染等模块的完整版,中英文对照
原文地址: http://www.cnblogs.com/ysdyaoguai/p/3746828.html In Unity scripting, there are a number of eve ...
- eclipse 导入新项目后报错:Cannot change version of project facet Dynamic web module to 2.5
错误原因: 我们用Eclipse创建Maven结构的web项目的时候选择了Artifact Id为maven-artchetype-webapp,由于这个catalog比较老,用的servlet还是2 ...
- Effective Java 38 Check parameters for validity
For public methods, use the Javadoc @throws tag to document the exception that will be thrown if a r ...
- Java 8 LongAdders:管理并发计数器的正确方式
转自:http://www.importnew.com/11345.html 我只是喜欢新鲜的事物,而Java 8 有很多新东西.这次我想讨论其中我最喜欢的之一:并发加法器.这是一个新的类集合,他们用 ...
- Json常用的转换
简单记录一下jquery里面的JSON.parse()和JSON.stringify()函数,和js中的eval()函数的用法 1,JSON.parse 函数(常用) 作用:将 JavaScript ...
- JS高级程序设计2nd部分知识要点3
对象转换方法:1> toLocaleString(),2> toString(),ValueOf()方法会返回相同的值 栈方法是 LIFO (后进先出)的数据结构 -push ,pop 方 ...
- 树莓派3 安装ubuntu-mate
1.系统安装 1.1.下载ubuntu-mate镜像:https://ubuntu-mate.org/raspberry-pi/ 下载SDFormatterv4:https://www.sdcard. ...
- SQOOP Load Data from Oracle to Hive Table
sqoop import -D oraoop.disabled=true \ --connect "jdbc:oracle:thin:@(description=(address=(prot ...
- [转载]ExtJs4 笔记(10) Ext.tab.Panel 选项卡
作者:李盼(Lipan)出处:[Lipan] (http://www.cnblogs.com/lipan/)版权声明:本文的版权归作者与博客园共有.转载时须注明本文的详细链接,否则作者将保留追究其法律 ...
- 2014 Super Training #4 G What day is that day? --两种方法
原题: ZOJ 3785 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3785 题意:当天是星期六,问经过1^1+2^2+ ...