关闭

RouteData MVC过滤器 OnActionExecuting() 在过滤器中获取触发控制器,Action 等

4622人阅读 评论(0) 收藏 举报
分类:

<1>

将区域的admin区域的Home控制器的Index视图设为默认启动项的路由设置

RouteConfig.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace FB.CMS.MvcSite
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                namespaces: new string[] { "FB.CMS.MvcSite.Areas.admin.Controllers" }//项目中如果存在多个Home控制器,需要设定Home控制器的名称空间

            ).DataTokens.Add("area", "admin") //.DataTokens.Add("area","admin")就表示将区域里的admin区域的Home控制器的Index视图设为默认启动项
            ;
        }
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVC过滤器.Filters
{
    //自定义一个过滤器
    [MyActionFilter]
    public class MyActionFilterAttribute:ActionFilterAttribute
    {
        //重写OnActionExecuting方法
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //我们先来了解一下这个filterContext参数:我们知道OnActionExecuting方法是在Action执行之前会被触发执行的一个方法,那就意味着,将来我在这里面写代码,想要知道你这一个OnActionExecuting方法到底是由那一个Action被调用的时候触发的 (因为所有的action方法被执行的时候都会触发OnActionExecuting这个过滤器方法,所以我就像要知道到底是哪个action被执行的时候触发的这个OnActionExecuting方法)

            //获取触发当前方法(OnActionExecuting)的Action名字(即:哪个Action方法被执行的时候触发的OnActionExecuting(ActionExecutingContext filterContext))
            string actionName = filterContext.ActionDescriptor.ActionName;

            //获取触发当前方法的的Action所在的控制器名字
            string controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;

            //获取触发当前方法的Action方法的所有参数(因为参数可能有多个,所以它是一个集合,它的返回值类型是IDictionary<string ,object> 下面为了好看,用var替代)
            var paramss = filterContext.ActionParameters;

            string str = "";
            if (paramss.Any()) //Any是判断这个集合是否包含任何元素,如果包含元素返回true,否则返回false
            {
                foreach (var key in paramss.Keys) //遍历它的键;(因为我们要获取的是参数的名称s,所以遍历键)
                {
                    str = key + "的值是" + paramss[key];  //paramss[key] 是key的值
                }
            }

            

            //获取当前请求的上下文
            filterContext.HttpContext.Response.Write("你好,我也好");


            //将触发当前方法的这个Action方法的返回结果视图换成一个JsonResult  ( filterContext.Result的返回类型就是JsonResult)

            //filterContext.Result:获取或设置由操作方法返回的结果。(既然是获取或者设置Action方法的返回结果,那么我们就可以在这里篡改触发当前方法的那个Action方法的返回结果

            //例如:触发当前方法的Action方法是这个:public ActionResult Add(){return Content("中国");} 这个Action方法的返回值是一个"中国"文本  那么我们在这里可以通过filterContext.Result来篡改它的返回值。比如这我给他返回一个json

            JsonResult json=new JsonResult();
            json.Data=new { status="1",message="OK"};
            json.JsonRequestBehavior = JsonRequestBehavior.AllowGet;

            filterContext.Result = json;


			
	    //假设我们在MVC项目中添加一个名字为admin的区域,然后再区域下添加一个Home控制器,然后添加一个Index视图。
	    //那现在我们访问这个视图的路径就是:http://localhost:5219/admin/home/index
            //获取区域
            var area = filterContext.RouteData.DataTokens;//MVC可以有区域的,这里就是负责存放区域的

            //获取区域名称
            var areaName = area["area"];//这个["area"]是写死了的。你根据["area"]就可以取到区域名称,因为区域的key固定就是area  所以这里areaName的值为admin


            //RouteData
            var rd = filterContext.RouteData; //在这里面可以获取控制名称,ation名称,参数名称

            var controlName = rd.Values["Controller"].ToString();
            var actName = rd.Values["Action"].ToString();
            
           
    
            
            
        }
    }
}



2
0
查看评论

MVC中Action过滤器(OnActionExecuting,OnActionExecuted,OnResultExecuting,OnResultExecued)

MVC中Action过滤器(OnActionExecuting,OnActionExecuted,OnResultExecuting,OnResultExecued)
  • luolian123456
  • luolian123456
  • 2017-06-20 10:46
  • 1124

asp.net mvc OnActionExecuting 方法重写后的执行顺序

依次为:子类 =》 基类 =》自定义过滤器
  • asp89007342
  • asp89007342
  • 2014-07-31 15:53
  • 1616

OnActionExecuting 中设置跳转指定网址或路由

protected override void OnActionExecuting(ActionExecutingContext filterContext) { #region 判断是否在移动设备上运行 bool mobileB = ...
  • lybwwp
  • lybwwp
  • 2015-05-28 10:51
  • 5235

mvc中OnActionExecuting和 OnAuthorization

执行顺序,OnAuthorization在AuthorizeAttribute特性种, 先执行OnAuthorization,然后执行AuthorizeCore函数; OnActionExecuting方法在ActionFilterAttribute特性中, 同时存在OnAuthoriza...
  • wildlifeking
  • wildlifeking
  • 2016-11-12 22:48
  • 1612

c# .net mvc webapi Filters 筛选器中获取 请求参数和响应内容

c# .net mvc webapi Filters 筛选器中获取 请求参数和响应内容
  • xxj_jing
  • xxj_jing
  • 2015-09-29 15:01
  • 10968

RouteData.DataTokens

ASP.NET MVC中RouteData.GetRequiredString("key")方法和RouteData.DataTokens["key"]方法使用上的区别 DataTokens中的Key是从Routing中获取的,可以是映射关系(可以不...
  • chengmodelong
  • chengmodelong
  • 2014-11-13 14:52
  • 1228

.NET Web API之filter ActionFilterAttribute 过滤器使用

.NET Web API之filter ActionFilterAttribute 过滤器使用
  • vaecnfeilong
  • vaecnfeilong
  • 2014-03-21 15:10
  • 7034

全局过滤器中排除指定Controller和action方法(二)

前文贴出了一种方式来排除Controller和action方法,但是感觉不太实用,因为如果遇到多个控制器,多个方法,就很难辨别了,今天我来介绍一种方式,加上标签,这种方法比较简单,相信你也会喜欢,麻烦的就是每个全局过滤器都要对应一个 不启用该全局过滤器的标签,不过为了功能实现,这点我们也暂时不去计较...
  • yangdaboke
  • yangdaboke
  • 2013-03-29 11:08
  • 4837

MVC四大筛选器—ActionFilter&ResultedFilter

AuthorizeFilter筛选器 在Action的执行中包括两个重要的部分,一个是Action方法本身逻辑代码的执行,第二个就是Action方法的筛选器的执行。 MVC4中筛选器都是以AOP(面向方面编程)的方式来设计的,通过对Action方法上标注相应的Attribute标签来实现。M...
  • zyh_1988
  • zyh_1988
  • 2016-08-17 20:12
  • 1308

RouteData MVC过滤器 OnActionExecuting() 在过滤器中获取触发控制器,Action 等

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVC过滤器.Filters { //自定义一个过滤器 ...
  • Fanbin168
  • Fanbin168
  • 2015-07-08 02:58
  • 4622
    个人资料
    • 访问:902637次
    • 积分:13467
    • 等级:
    • 排名:第1155名
    • 原创:473篇
    • 转载:26篇
    • 译文:2篇
    • 评论:77条
    最新评论