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. 【HZERO】安全体系

    安全体系 https://open.hand-china.com/community/detail/521336056218521600#前言前言open&doc-0

  2. 《consul 简易上手指南》

    consul 是一个用来做服务发现的框架,具有分布式.高可用以及可横向扩展的特性 什么是服务发现?为什么要实现服务发现? 举个常见的例子: 假设有一台 client 想要实现不同的业务,就需要调用接口 ...

  3. 厄拉多塞筛法的 Python 实现以及复杂度计算

    想要得到一个不大于N的数所有素数,可以先找到不超过根号N的所有素数,设2 = p1 < p2 < ......<pk ≤√N,然后在2,3,4......N里面进行下面的操作: 留下 ...

  4. HTTP Headers Content-Type 详解

    https://www.cnblogs.com/whosmeya/p/14315632.html

  5. zzuli 1079

    以EOF结束输入的处理 使用cin.hasNext(),现在还不懂就先记这了 import java.util.Scanner; public class Main{ public static vo ...

  6. 小白学标准库之反射 reflect

    1. 反射简介 反射是 元编程 概念下的一种形式,它在运行时操作不同类型的对象,检查对象的类型,大小等信息,对于没有源代码的包反射尤其有用. 设想一个场景,读取一个包中变量 a 的类型,并打印该类型的 ...

  7. pmp考试巩固知识点

    1.冲刺评审会是需要相关的干系人参加的,在冲刺评审会上干系人可以审查并澄清角色.责任和管理模式2.采购中的争议,往往找合同和SOW,SOW是对需要采购的详细范围的描述,与供应商在可交付成果方面有争议时 ...

  8. kafka 在 zookeeper 中保存的数据内容

    转载请注明出处: 1. 服务器上下载 kafka : wget https://archive.apache.org/dist/kafka/2.4.0/kafka_2.12-3.2.0.tgz 2.  ...

  9. C语言中的操作符:了解与实践

    ​ 欢迎大家来到贝蒂大讲堂 ​ 养成好习惯,先赞后看哦~ ​ 所属专栏:C语言学习 ​ 贝蒂的主页:Betty's blog 1. 操作符的分类 操作符又叫运算符,它在C语言中起着非常大的作用,以下是 ...

  10. Icoding 链表 删除范围内结点

    1.题目: 已知线性表中的元素(整数)以值递增有序排列,并以单链表作存储结构.试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),分析你的算法的时间复杂度. 链表结点 ...