采用一个简单的操作过滤器,检查用户是否登录并检索他们的用户ID。
public class LoginFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// Authenticate (somehow) and retrieve the ID
int id = Authentication.SomeMethod();
// Pass the ID through to the controller?
.....
}
}
字符串
然后我如何将这个ID传递给我的控制器操作?
[LoginFilter]
public class Dashboard : Controller
{
public ActionResult Index()
{
// I'd like to be able to use the ID from the LoginFilter here
int id = ....
}
}
型
有没有一个类似ViewBag的东西可以让我这样做?或者其他一些技术可以让我在过滤器和控制器动作之间传递变量和对象?
5条答案
按热度按时间voj3qocg1#
我相信
ActionExecutingContext
包含一个对调用控制器的引用。使用这个引用和一个从基类Controller
派生的自定义控制器类混合,然后将id
存储为控制器的示例变量可能就可以了。自定义控制器
字符串
登录过滤器
型
控制器
型
g2ieeal72#
你可以这样使用
ViewData/ViewBag
:1.)使用
ViewData
**注意:**在ViewData的情况下,你需要做一个步骤,那就是你必须类型转换它
字符串
然后在控制器功能中
型
2.)使用
ViewBag
型
然后在控制器中,
型
x33g5p2x3#
您可以通过执行以下操作来使用
ViewBag
:字符串
这样就可以了,一旦你做了
filterContext.Controller
,你就可以访问它里面的所有字段,比如TempData
。即便如此,如果您使用的是
OWIN
,那么您可能可以使用Controller.User
来获取用户的id,它有一个扩展方法来获取Id
,并有属性来获取大多数其他标准数据,如Name
等。fcg9iug34#
这是我在一个旧应用程序中看到的一个方法,它避免了使用viewbag,而是让控制器参数指定它们所期望的:
字符串
umuewwlo5#
我相信,使用控制器- ViewData或ViewBag是错误的解决方案。
定义一个具有所需属性的小类,并通过服务注册这个类。
字符串
在服务上,
型
现在您可以在Filter和Controller上使用依赖注入
型
同样的,通过依赖注入你的控制器。
型