1. 程式人生 > >MVC攔截器,MVC過濾器,MVC ActionFilterAttribute攔截器過濾器,OnActionExecuting

MVC攔截器,MVC過濾器,MVC ActionFilterAttribute攔截器過濾器,OnActionExecuting

mvc攔截器 mvc過濾器 mvc actionfilterattribute攔截器過濾器

該過濾攔截器動態攔截字符串和實體類檢查是否有關鍵字,對字符串和動態實體類進行修改很再提交。

第一步:新的攔截器類名並繼承ActionFilterAttribute :CustomerFilterAttribute:ActionFilterAttribute


第二步:在方法OnActionExecuting中實現


第三步:在對應的Action或者類上方加上[CustomerFilter]即可實現對該Action或者類進行攔截控制過濾。

完整代碼如下:


using System;

using System.Collections.Generic;

using System.Linq;

using System.Reflection;

using System.Security.Policy;

using System.Text;

using System.Web;

using System.Web.Mvc;

using System.Reflection;



namespace SaaS.Admin.Base

{

/// <summary>

/// 全局過濾器

/// </summary>

public class CustomerFilterAttribute:ActionFilterAttribute

{

/// <summary>

/// 在執行操作Action方法前執行調用

/// </summary>

/// <param name="filterContext"></param>

public override void OnActionExecuting(ActionExecutingContext filterContext)

{

base.OnActionExecuting(filterContext);

var parameters = filterContext.ActionDescriptor.GetParameters();

foreach (var parameter in parameters)

{

if (parameter.ParameterType == typeof(string))

{

//獲取字符串參數原值

var orginalValue = filterContext.ActionParameters[parameter.ParameterName] as string;

//使用過濾算法處理字符串

if (!string.IsNullOrEmpty(orginalValue) && orginalValue!="")

{

var filteredValue = HtmlEscapeCode(orginalValue);

////將處理後值賦給參數

filterContext.ActionParameters[parameter.ParameterName] = filteredValue;

}


}

else if (parameter.ParameterName =="model")

{

//獲取字符串參數原值

var value = filterContext.ActionParameters[parameter.ParameterName];


if (value.GetType().IsClass && value.GetType().Name != "String")//檢查是否是類,並且不是字符串類型

{


object objClass = value;//獲取字符串參數原值

PropertyInfo[] infos = objClass.GetType().GetProperties();//獲取原對象的所有公共屬性


#region 動態創建新實例【動態創建新的實體類實例】

System.Type tt = System.Type.GetType(value.ToString());//獲取指定名稱的類型

object ff = Activator.CreateInstance(tt, null);//創建指定類型實例

PropertyInfo[] fields = ff.GetType().GetProperties();//獲取指定對象的所有公共屬性


object obj = Activator.CreateInstance(tt, null);//創建新指定類型的實例【動態創建新的實例】

#endregion


foreach (PropertyInfo info in infos)

{

if (info.CanRead)

{

//Console.WriteLine(info.Name + "=" + info.GetValue(objClass, null));


if (info.PropertyType.Name == "String")

{

//獲取值

string orginalValue =Convert.ToString(info.GetValue(objClass, null));

if (!string.IsNullOrEmpty(orginalValue) || orginalValue!="")

{

//檢查過濾特殊字符

var filteredValue = HtmlEscapeCode(orginalValue);

//將處理後值賦給參數

info.SetValue(obj, filteredValue, null);

//給實體對象賦新值

filterContext.ActionParameters[parameter.ParameterName] = obj;

}

}

else

{

object orginalValue = info.GetValue(objClass, null);//獲取值

info.SetValue(obj, orginalValue,null);//給對象賦新值

filterContext.ActionParameters[parameter.ParameterName] = obj;//給實體類對象賦值

}

}

}


}

}


}


}


/// <summary>

/// 在執行操作Action方法後執行調用

/// </summary>

/// <param name="filterContext"></param>

public override void OnActionExecuted(ActionExecutedContext filterContext)

{

base.OnActionExecuted(filterContext);

var controllerName = filterContext.RouteData.Values["controller"];

var actionName = filterContext.RouteData.Values["action"];

}


//過濾關鍵字

public string HtmlEscapeCode(string html)

{

var strhtml = html.Replace("javascript", "")

.Replace("vbscript", "")

.Replace("jscript", "")

.Replace("script", "")

.Replace("eval", "")

.Replace("<", "<")

.Replace(">", ">")

.Replace("\‘", "'")

.Replace("\"", """)

.Replace("&", "&")

.Replace("#", "#");

return strhtml;

}


}

}


例如:如:對基類BaseController 進行控制


using System;

using System.Collections;

using System.Collections.Generic;

using System.Linq;

using System.Web.Mvc;

using Microsoft.Practices.ServiceLocation;

using SaaS.Contracts.SaaS.Intern;

using SaaS.Framework.IIdentity;

using SaaS.Models.Domain.Enums;


namespace SaaS.Admin.Base

{

/// <summary>

/// 基礎Controller

/// </summary>

[CustomerFilter]

public class BaseController : Controller

{

/// <summary>

/// 彈出成功提示

/// </summary>

/// <param name="message">成功消息</param>

/// <param name="url">跳轉路徑</param>

/// <returns></returns>

protected ActionResult SuccessResult(string message, string url)

{


TempData["SuccessResult"] = message;

return Redirect(url);

}

MVC攔截器,MVC過濾器,MVC ActionFilterAttribute攔截器過濾器,OnActionExecuting