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中的Action过滤器的更多相关文章

  1. MVC中使用Action全局过滤器出现:网页无法正常运作 将您重定向的次数过多。解决办法

    前言当我们访问某个网站的时候需要检测用户是否已经登录(通过Session是否为null),我们知道在WebForm中可以定义一个BasePage类让他继承System.Web.UI.Page,重写它的 ...

  2. MVC中的错误过滤器无法拦截URL路径错误的解决办法

    “/”应用程序中的服务器错误. 无法找到资源. 说明: HTTP 404.您正在查找的资源(或者它的一个依赖项)可能已被移除,或其名称已更改,或暂时不可用.请检查以下 URL 并确保其拼写正确. 请求 ...

  3. mvc中的action验证登录(ActionFilterAttribute)

    方法一 :  1.创建一个全局action过滤器  (在appstart  的filterconfig中注册   filters.Add(new LoginAttribute());)  2.不需要登 ...

  4. ASP.NET MVC中在Action获取提交的表单数据方法总结 (4种方法,转载备忘)

    有Index视图如下: 视图代码如下: <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Mas ...

  5. ASP.NET MVC中在Action获取提交的表单数据方法

    有Index视图如下: 视图代码如下: <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Mas ...

  6. MVC中@Html.Action的用法

    MVC项目中如果有公共部分的代码就可以单独拿出来作为控件来用(比如头部和底部代码).跟ASP.NET中的ASCX实现的效果一样,但MVC比它方便的多. 想要实现该效果,需要知道@Html.Action ...

  7. MVC中@Html.Action的用法(类似自定义控件)

    MVC项目中如果有公共部分的代码就可以单独拿出来作为控件来用(比如头部和底部代码).跟ASP.NET中的ASCX实现的效果一样,但MVC比它方便的多. 一.@Html.Action的用法 @Html. ...

  8. .NET MVC中登陆授权过滤器的使用

    1.写个类LoginAuthorityAttribute,继承自AuthorizeAttribute using System; using System.Collections.Generic; u ...

  9. mvc中在Action里调用另一个Action

    今天做东西时发现一个新东西.即在一个Action调用另一Action.前提是同一个控制器.(没在一个控制里的没试过) 调用方法: public   ActionResult Test1(){ //to ...

随机推荐

  1. QT程序拷贝 转移 改变运行环境

    qt程序 在windows平台下怎么运行? 以前开发环境是VS2008编译 +qt-win-opensource-4.7.4-vs2008框架 +QtCreator编辑界面(以前的例子,win7下成功 ...

  2. Manifest merger failed with multiple errors, see logs

    Manifest merger failed with multiple errors, see logs 错误解决 合并 manifest 错误. https://blog.csdn.net/u01 ...

  3. Android Studio NDK编程-环境搭建及Hello!

    一,下载 安装android-ndk开发包 NDK各个版本链接二,新建项目NDKDemo,选择空Activity就可以:(注:Android studio 2.2,可通过SDK Tools 添加LLD ...

  4. backupAgent节点

    在<application>节点中有一个非常重要的属性,那就是backupAgent. 1.backupAgent简介 Androidd:backupAgent用来设置备份代理.对于大部分 ...

  5. 魔法方法 __slots__ 方法

    场景解析 网游的用户, 大量的用户本质都是类的实例化对象, 在线人数百万级时对内存是很大的挑战, 如何减少这部分的内存 方法解析 __slots__ 方法 取消默认的类实例中的  __dict__  ...

  6. Oracle11gR2之ORA-01034、ORA-27101、ORA-00119、 ORA-00132

    昨天安装的oracel,今天用navicat连接oracel出现以下错误: ORA-01034: ORACLE not available ORA-27101: shared memory realm ...

  7. 树莓派-Ubuntu Mate开启ssh服务

    1. 运行 apt search openssh-server 查看是否安装ssh服务. 2. 如已安装,运行 sudo dpkg-reconfigure openssh-server 重新配置shh ...

  8. python字典操作+文件操作+函数

    师从百测besttest今天老牛教了些函数调用的知识,布置了个作业如下: # 1.写一个商品管理的小程序# 2.商品存在文件里面# 1.添加商品# 输入产品名称.颜色.价格# 要校验商品是否存在,价格 ...

  9. iscsi-分区类型

    iSCSI简介(Internet SCSI): iSCSI 小型计算机系统接口,IBM公司研发,用于在IP网络上运行SCSI协议:解决了 SCSI需要直连存储设备的局限性:可以不停机扩展存储容量,iS ...

  10. python之xml数据解析

    因为项目需求需要查询一些网站的ALEXA排名,百度后得到的方法是,访问http://data.alexa.com/data?cli=10&dat=snbamz&url=%YOURURL ...