我有一个字段是一个控制器类(用户),它跟踪当前用户。在不同的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"];
}
}
答案 0 :(得分:3)
首先,我不认为你真的是属于属性,而是属于Field。
这就是属性的样子:
[HelpAttribute("http://localhost/MyClassInfo")]
这就是Field的样子:
public int CurrentUserId = -1;
第二次,如果您需要的只是用户详细信息,请在User
上下文中使用HttpContext.Current.User
媒体资源Action
。
您可以在任何Controller
中使用它,因为HttpContext
是Controller
属性(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完成请求之前,这是加载请求特定状态的理想位置。