【问题标题】:Accessing an Attribute in a different Controller Class访问不同控制器类中的属性
【发布时间】:2014-02-25 02:41:33
【问题描述】:

我有一个字段是跟踪当前用户的控制器类(用户)。在另一个控制器类(博客)中,我想访问该属性(CurrentUser),但问题是我必须创建一个不起作用的控制器类的新实例。有没有一种在不创建新类的情况下访问此属性的好方法?

这是一个例子:

用户控制器类:

public class UserController : Controller 
{
    public int CurrentUserId = -1; // This line as been removed

    //Methods go below
    // ...

    public void Login(User user)
    {
           HttpContext.Items["UserId"] = user.Id;
    }

博客控制器类:

public class BlogController : Controller
{
    public ActionResult NewBlogPost(Article ArticleToCreate)
    {
         ArticleToCreate.AudthorId = (int)HttpContext.Items["UserId"];
    }
}

【问题讨论】:

  • 您是如何使用属性来存储数据的? (我在您的 sn-ps 中看不到任何属性...)您使用的是静态包装器属性还是什么?除非我遗漏了什么,否则这似乎是错误的处理方式。
  • 如何保存当前用户?
  • 您的标题提到了属性,但您的代码示例中没有。有点不对劲……

标签: c# asp.net-mvc-4 httpcontext


【解决方案1】:

首先,我认为您的真正意思不是属性,而是字段。

这是一个属性的样子:

[HelpAttribute("http://localhost/MyClassInfo")]

这就是字段的样子:

public int CurrentUserId = -1;

其次,如果您只需要用户详细信息,请在您的Action 上下文中使用User 属性:HttpContext.Current.User

您可以在任何Controller 中使用它,因为HttpContextController 属性(this.HttpContext)。

至于共享其他控制器数据,我认为没有任何意义,因为每个新请求都会初始化另一个Controller 类实例,HTTP 是stateless

此外,为了添加额外的用户详细信息,例如:UserId,请使用 HttpContext.Items Dictionary 属性, 在任何新请求下,您都可以在任何控制器中使用此数据,就像 User 属性一样,例如:

HttpContext.Items["UserId"] = 200;

更新

为了能够在任何 Conroller 的操作中访问 HttpContext.Items 属性,请将其设置在 Global.asax 文件中的 Application_BeginRequest 处理程序中,而不是像您所做的那样在 Controller 中:

protected void Application_BeginRequest(Object sender, EventArgs e)
{     
  int userId = //Logic to retrieve the `UserId`.
  Context.Items["UserId"] = userId;
}

这是加载请求特定状态以执行直到 ASP.NET MVC 完成请求的理想位置。

【讨论】:

  • 我将如何将此属性设置为一个值?
  • @user977154 基本上,如果您正在使用其中一种身份验证机制,则应该为您提供用户详细信息。
  • 它说当前不存在
  • 好的,我正在调试我的代码。我在用户登录时设置了该属性,我看到该值已保存到该属性中。但是当我尝试在另一个控制器中获取该属性时,它会得到一个空结果
  • 好的,但是我无法获取userId,因为它是在登录方法下的UserController类中生成的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
  • 1970-01-01
  • 2016-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多