http://www.itfanr.cc/2016/04/17/transfer-data-from-filter-to-action/

MVC和WebAPI如何从Filter向Action中传递数据

需求

最近在策划实现MVC项目中用户身份验证的功能时,考虑用MVC中的Filter过滤器来先从url链接中获取传递过来的token,在Filter中通过token获取用户的信息后,如果用户信息正确,则传递到ControllerAction中进行用户数据的操作。

那么,要如何从Filter中向Action中传递数据呢?

how to pass data from filter to controller?


注意:下面所提到的Filter都指实现ActionFilterAttribute的过滤器

MVC中 从Filter过滤器向Action中传递数据

方法一 通过 RouteData 来传值
1
2
3
4
5
//赋值:
filterContext.RouteData.Values.Add("Tname",UName);

//获取:
var nm = RouteData.Values["Tname"];
 

测试通过。

详见: ASP.NET MVC Pass object from Custom Action Filter to Action - Stack Overflow


方法二 通过 ActionParameters 来传值

另一种方法是通过 ActionParameters 来设置,但在Action中是通过添加参数获取值的:

1
2
3
4
//赋值:  
filterContext.ActionParameters.Add("number", Id);
//获取:
public ActionResult Index(int number, Person person)
 

详见: Manipulating Action Method Parameters - You’ve Been Haacked

通过测试,发现这种方法可以隐藏真实的Action方法:

比如:
请求的链接是 http://localhost:47760/home/show?id=3&name=abc
而实际的Action为:

1
public ActionResult Show(string aaa){}
 

那么可以通过添加一个 ActionFilterAttribute 过滤器,并设置:

1
2
this.Uname=getquerystring.name;
filterContext.ActionParameters["aaa"] = UName;
 

这样虽然url中请求的参数时id和name,而实际请求参数是aaa

而实际的请求链接 http://localhost:47760/home/show?aaa=haha 也是可以访问的。


方法三 通过 HttpContext.Items 来传值
1
2
3
4
//Filter中赋值:  
filterContext.HttpContext.Items["tname"] = UName+"2324";
//Action中取值:
var nm= HttpContext.Items["tname"];
 

测试通过。

通过测试发现好像这种方式比较合适。因为:可看到Items的解释为:

在派生类中重写时,获取一个键/值集合,该集合在 HTTP 请求过程中可以用于在模块与处理程序之间组织和共享数据。

详见: asp.net mvc - Accessing Action Filter's data in Controller Action - Stack Overflow


WebAPI中从Filter向Action中传递数据

如何从Filter向Action中传递数据?

方法一 通过 Request.Properties 来传值
1
2
3
4
//Filter中赋值:  
actionContext.Request.Properties["id"] ="134";
//Action中获取:
var id= Request.Properties["id"];
 

或:

1
2
3
4
5
6
//赋值:  
actionContext.Request.Properties.Add("mykey", myObject);
//获取:
object myObject;
Request.Properties.TryGetValue("mykey", out myObject);
//cast to MyType
 

测试通过。

详见:


总结

MVC 用 :

1
filterContext.HttpContext.Items[UnitOfWorkRequestKey] = UnitOfWork;
 

Web API 用 :

1
actionContext.Request.Properties[UnitOfWorkRequestKey] = UnitOfWork;
 

详见: c# - Web API Action Filter - Controller.TempData equivalent? - Stack Overflow

MVC和WebAPI如何从Filter向Action中传递数据的更多相关文章

  1. ASP.NET MVC中如何以ajax的方式在View和Action中传递数据

    前言:写这篇随笔的时候,在url上漏写了斜线,找了好久错误,整个人都很不好.#我是猪系列 背景:之前介绍过一篇如何构建 MVC&AJax&JSon示例,这一篇单独讲解如何在View和A ...

  2. 一步步学习ASP.NET MVC3 (5)——View从Action中获得数据

    请注明转载地址:http://www.cnblogs.com/arhat 在上一章中,我们把Razor的模板技术给大家介绍了一下,当然模板中还有其他的知识点,这个以后我们还会继续讲解.本章我们主要讨论 ...

  3. Struct2 向Action中传递参数(中文乱码问题)

    就是把视图上的值传递到Action定义的方法中 也就是把数据从前台传递到后台 三种方式: 1.  使用action属性接收参数 比如jsp页面: <body> 使用action属性接收参数 ...

  4. Struts2获取Action中的数据

    当我们用Struts2框架开发时,经常有要获取jsp页面的数据或者在jsp中获取后台传过来的数据(Action),那么怎么去获取自己想要的数据呢? 后台获取前端数据: 在java程序中生成要获取字段的 ...

  5. struts2 action中传递两个参数到url

    <action name="outInDetail" class="formManage_outInDetailAction"> <resul ...

  6. Tomcat + Spring MVC + HttpClient:怎样使用PUT和PATCH方法传递数据

    在RESTful风格的API中.PUT/PATCH方法一般用于更新数据.在项目的代码中,使用的是HttpClient 4.5,是这样写的: protected JSONObject doHttpUri ...

  7. view如何从action中取得数据和 Html辅助方法

    方式:1使用弱类型取,2,使用强类型,两者的差别在于view页面最上方声明的方式   如果使用弱类型接受来自控制器的数据,在view页面里完全不需要有任何的生命,数据可以从ViewData,ViewB ...

  8. View从Action中获得数据和html helper function(转载)

    @model MvcApplication1.Models.M_Person @using MvcApplication1.Models; @{ ViewBag.Title = "GetDa ...

  9. ACTION中获得数据的几种方式

    1.第一种是通过公司封装的方法. 2.第二种:是通过IF方法判断 3.第三种是通过:set/get获得

  10. [ASP.NET MVC 小牛之路]09 - Controller 和 Action (1)

    我们知道,在 MVC 中每个请求都会提交到 Controller 进行处理.Controller 是和请求密切相关的,它包含了对请求的逻辑处理,能对 Model 进行操作并选择 View 呈现给用户, ...

随机推荐

  1. 【计算机网络】JWT token、Session

    JWT token https://www.bilibili.com/video/BV1VM4y117qr/?spm_id_from=333.999.0.0&vd_source=d112766 ...

  2. C++ 20 标准协程入门教程

    基本概念 (是什么) 协程(coroutine): 是一种特殊的函数,其可以被暂停(suspend), 恢复执行(resume).一个协程可 以被多次调用. 协程(coroutine): 分为stac ...

  3. #1016:Prime Ring Problem(经典DFS)

    原题链接 题意:很容易理解,就是让你输出满足相邻的相加是素数的序列(注意不要重复) 思路就是深搜思想把每种情况遍历一次 代码实现: #include<iostream> #include& ...

  4. ios-class-guard - iOS代码混淆与加固实践

    ​ 目录 ios-class-guard - iOS代码混淆与加固实践 摘要 引言 一.class-dump 二.ios-class-guard 混淆原理 三.ios-class-guard 混淆结果 ...

  5. 最全!即学即会 Serverless Devs 基础入门(下)

    作者 | 刘宇(阿里云 Serverless 产品经理) 在上篇<最全!即学即会 Serverless Devs 基础入门>中,我们阐述了工具链的重要性,并对安装方式 & 密钥配置 ...

  6. springboot 实现接收前端发来的图片和视频以及在页面上展示图片和视频

    springboot 实现接收前端发来的图片和视频以及在页面上展示图片和视频 一.效果: 1.上传图片 2.显示上传的图片 3.上传的视频 4.显示上传的视频 二.代码 没依赖特殊的包,引入sprin ...

  7. WebGPU光追引擎基础课系列目录

    大家好~我开设了"WebGPU光追引擎基础课"的线上课程,从0开始,在课上带领大家现场写代码,使用WebGPU开发基础的光线追踪引擎 课程重点在于基于GPU并行计算,实现BVH构建 ...

  8. vue后台管理系统,接口环境配置

    https://coding.imooc.com/lesson/397.html#mid=31487

  9. 【解决方案】如何使用 Http API 代替 OpenFeign 进行远程服务调用

    目录 前言 一.何为OpenFeign 1.1@FeignClient注解 1.2注意事项 二.常见的Http API 2.1Apache 2.2Okhttp 2.3Hutool 三.RestTemp ...

  10. 完美:C# Blazor中显示Markdown并添加代码高亮

    昨天发了一篇介绍这个库:C# Blazor中显示Markdown文件,介绍怎么在Blazor中显示Markdown内容的文章,文章内的代码是没有高亮的,思来相去,还是要做好,于是百度到这篇文章.NET ...