如何在ASP.NET MVC 4应用程序中使用会话?

我是ASP.NET MVC的新手。 我以前使用PHP,很容易创build一个会话,并根据当前的会话variablesselect用户logging。

我已经在互联网上到处寻找一个简单的分步教程,可以告诉我如何在我的C#ASP.NET MVC 4应用程序中创build和使用会话。 我想创build一个用户variables的会话,我可以从我的控制器的任何地方访问,并能够在我的LINQ查询中使用variables。

-提前致谢!

尝试

//adding data to session //assuming the method below will return list of Products var products=Db.GetProducts(); //Store the products to a session Session["products"]=products; //To get what you have stored to a session var products=Session["products"] as List<Product>; //to clear the session value Session["products"]=null; 

由于Web的无状态特性,会话也是通过序列化并将它们存储在会话中来保持跨请求的对象的非常有用的方法。

一个完美的用例可能是,如果您需要在整个应用程序中访问常规信息,为每个请求保存额外的数据库调用,则可以将这些数据存储在一个对象中,并在每个请求上进行非串行化,如下所示:

我们的可重用,可序列化的对象:

 [Serializable] public class UserProfileSessionData { public int UserId { get; set; } public string EmailAddress { get; set; } public string FullName { get; set; } } 

用例:

 public class LoginController : Controller { [HttpPost] public ActionResult Login(LoginModel model) { if (ModelState.IsValid) { var profileData = new UserProfileSessionData { UserId = model.UserId, EmailAddress = model.EmailAddress, FullName = model.FullName } this.Session["UserProfile"] = profileData; } } public ActionResult LoggedInStatusMessage() { var profileData = this.Session["UserProfile"] as UserProfileSessionData; /* From here you could output profileData.FullName to a view and save yourself unnecessary database calls */ } } 

一旦这个对象被序列化,我们可以在所有的控制器中使用它,而不需要创build它或者再次查询数据库中包含的数据。

使用dependency injection来注入会话对象

在一个理想的世界中,你将“ 编程到一个接口,而不是实现 ”,并使用你select的Inversion of Control容器将你的序列化会话对象注入到你的控制器中,像这样(这个例子使用StructureMap,因为它是我最熟悉的)。

 public class WebsiteRegistry : Registry { public WebsiteRegistry() { this.For<IUserProfileSessionData>().HybridHttpOrThreadLocalScoped().Use(() => GetUserProfileFromSession()); } public static IUserProfileSessionData GetUserProfileFromSession() { var session = HttpContext.Current.Session; if (session["UserProfile"] != null) { return session["UserProfile"] as IUserProfileSessionData; } /* Create new empty session object */ session["UserProfile"] = new UserProfileSessionData(); return session["UserProfile"] as IUserProfileSessionData; } } 

然后您将在Global.asax.cs文件中注册。

对于那些不熟悉注入会话对象的人,可以在这里find关于这个主题的更深入的博客文章。

一句警告:

值得注意的是,会议应该保持在最低限度,大型会议可能会导致性能问题。

也build议不要在其中存储任何敏感数据(密码等)。

这是会话状态在ASP.NET和ASP.NET MVC中的工作方式:

ASP.NET会话状态概述

基本上,你要做的是在Session对象中存储一个值:

 Session["FirstName"] = FirstNameTextBox.Text; 

要检索值:

 var firstName = Session["FirstName"]; 

U可以存储session中的任何值,如Session [“FirstName”] = FirstNameTextBox.Text; 但我会build议你把它作为模型赋值的静态字段,你可以访问任何应用程序中的字段值。 你不需要会话。 应避免会议。

 public class Employee { public int UserId { get; set; } public string EmailAddress { get; set; } public static string FullName { get; set; } } 

在控制器上 – Employee.FullName =“ABC”; 现在你可以在应用程序的任何地方访问这个完整的名