访问不同Controller类中的属性

时间:2014-02-25 02:41:33

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

我有一个字段是一个控制器类(用户),它跟踪当前用户。在不同的Controller类(博客)中,我想访问该属性(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"];
    }
}

1 个答案:

答案 0 :(得分:3)

首先,我不认为你真的是属于属性,而是属于Field。

这就是属性的样子:

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

这就是Field的样子:

public int CurrentUserId = -1;

第二次,如果您需要的只是用户详细信息,请在User上下文中使用HttpContext.Current.User媒体资源Action

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

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

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

HttpContext.Items["UserId"] = 200;

<强>更新

为了能够在任何Conroller的Action中访问HttpContext.Items属性,请在Application_BeginRequest文件中的Global.asax处理程序中设置它,而不是在Controller中,就像你做的那样:

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

在ASP.NET MVC完成请求之前,这是加载请求特定状态的理想位置。