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

我是 ASP.NET MVC 的新手。我以前使用过 PHP,创建会话并根据当前会话变量选择用户记录很容易。

I have looked everywhere on the Internet for a simple step-by-step tutorial that can show me how to create and use sessions in my C# ASP.NET MVC 4 application. I want to create a session with user variables that I can access from anywhere in my controllers and be able to use the variables in my LINQ queries.

479616 次浏览

This is how session state works in ASP.NET and ASP.NET MVC:

NET 会话状态概述

基本上,这样做是为了在 Session 对象中存储一个值:

Session["FirstName"] = FirstNameTextBox.Text;

检索值:

var firstName = Session["FirstName"];

试试看

//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 */
}


}

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

使用依赖注入注入会话对象

在一个理想的世界里,你可以使用你选择的控制反转容器将你的可序列化会话对象注入到你的控制器中,就像这样(这个例子使用了 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文件中注册它。

对于那些不熟悉注入会话对象的人,您可以找到关于主题 给你的更深入的博客文章。

警告你一句:

It's worth noting that sessions should be kept to a minimum, large sessions can start to cause performance issues.

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

可以在会话中存储任何值,如 Session [“ FirstName”] = FirstNameTextBox.Text; 但我会建议你采取静态字段模型赋值给它,你可以访问该字段值在任何地方的应用。你不需要治疗。应该避免会面。

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

全名 = “ ABC”; Now u can access this full Name anywhere in application.

您可以使用以下方法在会话中存储任何类型的数据:

Session["VariableName"]=value;

这个变量将持续20分钟左右。