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 ...
随机推荐
- CoreAnimation-03-隐式动画
简介 每个UI控件,默认自动创建一个图层(根图层),即每个UI控件对应于至少一个图层 可以手动创建图层,这些图层为非根图层 对非根图层的某些属性(标记为Animatable的属性)进行修改,默认会自动 ...
- IOS-Swift、Objective-C、C++混合编程
1.Objective-C调用C++代码 后缀为m文件的是Objective-C的执行文件,而后缀为mm文件的是Objective-C++文件. 直接在Objective-C中是无法调用C++代码的, ...
- java集合 之 set 集合
set集合可以存储多个对象,但并不会记住元素的存储顺序,也不允许集合中有重复元素(不同的set集合有不同的判断方法). 1.HashSet类 HashSet按照Hash算法存储集合中的元素,具有很好的 ...
- eval 为什么加括号
<!DOCTYPE html> <html> <head> <title>eval学习</title> <script type=&q ...
- windows分离系统文件和用户数据
2013/12/17更新:使用了一段时间,开机时有时会出现一些错误,不过不影响正常使用,不能忍的是会经常更新,所以暂时不推荐使用. 为了方便地重装系统,同时保留用户数据,想到了分离windows系统文 ...
- ubuntu 获取root权限
实验环境: ubuntu 13.04 背景:现在有一台装有 ubuntu 的电脑,如何获取root权限? 方案一:进入单用户维护模式,重置root密码. 方案二:U盘挂载原根分区,修改/etc/pas ...
- 推送(PUSH)
一.本地推送 1.建立本地推送 UILocalNotification *notification = [[UILocalNotification alloc] init]; //推送的内容 noti ...
- 换新 iPhone 前要做的 9 件事
iPhone 6 以及 iPhone 6 Plus 终于在众人的期盼下发布了,是不是很多朋友都跃跃欲试,想入手新的 iPhone 呢?若你手中持有旧款 iPhone 的话,其实更换成新机后,还有不少事 ...
- 怎么录制Android视频
有时候我们做了一个Android App想发篇技术文章分享给大家看看效果,该怎么录制这个demo视频呢? 如果你采用的是Android4.4以上版本,可以直接用以下命令来录制视频 adb shell ...
- C++杂谈(一)const限定符与const指针
const限定符 c++有了新的const关键字,用来定义常变量,可以替C语言中的#define.关于const限定符,有以下需要注意: 1.创建后值不再改变 2.作用范围在文件内有效 3.添加ext ...