Go homepage(回首页) Upload pictures (上传图片) Write articles (发文字帖)
The author:(作者)归海一刀published in(发表于) 2014/1/30 1:13:56 通过IHttpHandlerFactory,过滤TextBox、Input和Textarea中的字符_[Asp.Net教程]
通过IHttpHandlerFactory,过滤TextBox、Input和Textarea中的特殊字符
通过IHttpHandlerFactory过滤特殊字符,可以做到和具体项目无关,部署起来也挺简单。using System;using System.IO;using System.Web.UI;using System.Web;using System.Configuration;using System.Text.RegularExpressions;using System.Web.Compilation;using System.Reflection;using System.Collections.Specialized;using System.Web.UI.WebControls;using System.Web.UI.HtmlControls;
namespace JianCaiWeb.Utils{ public class FilterStrFactoryHandler : IHttpHandlerFactory { public virtual IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated) { //得到编译实例(通过反射) PageHandlerFactory factory = (PageHandlerFactory)Activator.CreateInstance(typeof(PageHandlerFactory),true); IHttpHandler handler = factory.GetHandler(context, requestType, url, pathTranslated); //过滤字符串 if (requestType == "POST") { Page page = handler as Page; if (page != null) page.PreLoad += new EventHandler(FilterStrFactoryHandler_PreLoad); }
//返回 return handler; } //过滤TextBox、Input和Textarea中的特殊字符 void FilterStrFactoryHandler_PreLoad(object sender, EventArgs e) { try { Page page = sender as Page; NameValueCollection postData = page.Request.Form; foreach (string postKey in postData) { Control ctl = page.FindControl(postKey); if (ctl as TextBox != null) { ((TextBox)ctl).Text = Common.InputText(((TextBox)ctl).Text); continue; } if (ctl as HtmlInputControl != null) { ((HtmlInputControl)ctl).Value = Common.InputText(((HtmlInputControl)ctl).Value); continue; } if (ctl as HtmlTextArea != null) { ((HtmlTextArea)ctl).Value = Common.InputText(((HtmlTextArea)ctl).Value); continue; } } } catch { } }
public virtual void ReleaseHandler(IHttpHandler handler) { } }}
Common.InputText的代码为: //字符串过滤 public static string InputText(string text) { text = text.Trim(); if (string.IsNullOrEmpty(text)) return string.Empty; text = Regex.Replace(text, "[\\s]{2,}", " "); //two or more spaces text = Regex.Replace(text, "(<[b|B][r|R]/*>)+|(<[p|P](.|\\n)*?>)", "\n"); // text = Regex.Replace(text, "(\\s*&[n|N][b|B][s|S][p|P];\\s*)+", " "); // text = Regex.Replace(text, "<(.|\\n)*?>", string.Empty); //any other tags text = text.Replace("'", "''"); return text; }项目中的web.config文件加上这句话: 代码其实挺好理解,就是在提交数据的时候(requestType=="POST"),通过PageHandlerFactory找到页面实例,将过滤字符串的方法(FilterStrFactoryHandler_PreLoad)加到Page实例的PreLoad事件上,使用这个方法有一个前提,就是Input和Textarea控件必须作为服务器控件运行,如果不这样做的话,就不能通过页面实例的FindControl方法找到相应的控件。
来源:http://www.cnblogs.com/fengfeng
赞