我是ASP.NET MVC的新手。我之前使用过PHP,很容易创建会话并根据当前会话变量选择用户记录。
我已经在互联网上找到了一个简单的分步教程,可以向我展示如何在我的C#ASP.NET MVC 4应用程序中创建和使用会话。我想创建一个包含用户变量的会话,我可以从控制器的任何地方访问这些变量,并且能够在我的LINQ查询中使用这些变量。
- 提前谢谢!
答案 0 :(得分:148)
尝试
//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;
答案 1 :(得分:59)
由于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 */
}
}
一旦这个对象被序列化,我们可以在所有控制器上使用它,而无需创建它或再次查询数据库中包含的数据。
使用依赖注入
注入会话对象在一个理想的世界中,你会'program to an interface, not implementation'并使用你选择的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
文件中注册。
对于那些不熟悉注入会话对象的人,您可以找到关于主题here的更深入的博客文章。
警告:
值得注意的是,会话应该保持在最低限度,大型会话可能会导致性能问题。
还建议不要在其中存储任何敏感数据(密码等)。
答案 2 :(得分:16)
这是会话状态在ASP.NET和ASP.NET MVC中的工作方式:
ASP.NET Session State Overview
基本上,这样做是为了在Session对象中存储一个值:
Session["FirstName"] = FirstNameTextBox.Text;
要检索值:
var firstName = Session["FirstName"];
答案 3 :(得分:0)
您可以使用以下方法在会话中存储任何类型的数据:
Session["VariableName"]=value;
此变量将持续20分钟左右。
答案 4 :(得分:-7)
U可以在会话中存储任何值 Session [“FirstName”] = FirstNameTextBox.Text; 但我建议你把模型赋值的静态字段作为静态字段,你可以在应用程序的任何地方访问该字段值。你不需要会话。会话应该避免。
public class Employee
{
public int UserId { get; set; }
public string EmailAddress { get; set; }
public static string FullName { get; set; }
}
控制器上的- Employee.FullName =“ABC”; 现在,您可以在应用程序的任何位置访问此完整名称。