MVC中的Action过滤器
Action过滤器可以用在调用动作方法之前或之后,执行一些特殊的逻辑,比如用登录验证:
Action过滤器实现IActionFilter接口,该接口有两个方法:
public interface IActionFilter { void OnActionExecuted(ActionExecutedContext filterContext); void OnActionExecuting(ActionExecutingContext filterContext); } |
我们先创建一个BaseController,在这个基类中重写OnActionExecuting方法,用于让其他的控制器继承此基类。如:
using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Script.Serialization; using XFK.PICCInsureTravel.Common; using XinfuMall.XinfuWeb.PublicClass; namespace XFK.PICCInsureTravel.Controllers { public abstract class BaseController : Controller { public JavaScriptSerializer js = new JavaScriptSerializer(); public LogHelper log = null ; public UserSession user { get ; set ; } public EnterpriseAccountSession enterprise { get ; set ; } protected override void OnActionExecuting(ActionExecutingContext filterContext) { base .OnActionExecuting(filterContext); LogHelper.WriteLog( "进入BaseController" ); TempData[ "xinfuUrl" ] = System.Configuration.ConfigurationManager.AppSettings[ "xinfuUrl" ]; if (XFK.Infrastructure.Util.SessionManager.Read(UserUtil.user_sessionStr) != null ) { user = XFK.Infrastructure.Util.SessionManager.Read(UserUtil.user_sessionStr) as UserSession; object enterpriseId = XFK.Infrastructure.Util.SessionManager.Read(EnterpriseUtil.enterprise_sessionId); enterprise = new EnterpriseAccountSession(); enterprise.Id = Convert.ToInt32(enterpriseId); ViewBag.UserName = user.AccountName; ViewBag.Enterpriseid = Convert.ToInt32(enterpriseId); var limitEnterprise = String.IsNullOrEmpty(ConfigurationManager.AppSettings[ "limitEnterprise" ]) ? "" : ConfigurationManager.AppSettings[ "limitEnterprise" ]; if (limitEnterprise.Split( ',' ).Contains(enterprise.Id.ToString())) { System.Web.HttpContext.Current.Response.Write( "对不起,所属的企业没有订购此产品的权限!" ); } } else { filterContext.Result = new RedirectResult(ConfigurationManager.AppSettings[ "xinfuUrl" ] + "mall/Login?originUrl=" + HttpUtility.UrlEncode(Request.Url.ToString())); LogHelper.WriteLog( "当前访问的路径是:" + ConfigurationManager.AppSettings[ "xinfuUrl" ] + "mall/Login?originUrl=" + HttpUtility.UrlEncode(Request.Url.ToString())); } } } } |
注意,当验证不通过时,我们给filterContext.Result赋值,用于跳转页面。这个filterContext.Result属性是一个ActionResult类型的子集---RedirectResult:
当执行到filterContext.Result时,我们给它赋值以后,便会执行跳转。
这个BaseController建好以后,下面的工作就是在其他控制器中使用了:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace XFK.PICCInsureTravel.Controllers { public class HomeController : BaseController { public ActionResult Index() { return View(); } } } |
参考:http://skybirdzw.blog.163.com/blog/static/72570626201781465310313/
分类:
MVC
标签:
IActionFilter
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端