我是ASP.NET MVC的新手。之前我使用过PHP,创建会话并基于当前会话变量选择用户记录非常容易。
我在互联网上寻找了许多简单的、逐步指导的教程,以便向我展示如何在我的C# ASP.NET MVC 4应用程序中创建和使用会话。我想要创建一个会话,其中包含用户变量,我可以从任何控制器中访问这些变量,并能在我的LINQ查询中使用这些变量。
我是ASP.NET MVC的新手。之前我使用过PHP,创建会话并基于当前会话变量选择用户记录非常容易。
我在互联网上寻找了许多简单的、逐步指导的教程,以便向我展示如何在我的C# ASP.NET MVC 4应用程序中创建和使用会话。我想要创建一个会话,其中包含用户变量,我可以从任何控制器中访问这些变量,并能在我的LINQ查询中使用这些变量。
尝试
//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;
WebSecurity.CurrentUserId
的值存储起来以避免多次从数据库中获取它是否安全(我发现这样做非常昂贵)? - Andrius NaruševičiusAccount/LogOn
请求另一个控制器(例如到Home/Index
)时,Session["FirstName"]
为null
。
开发人员必须创建一个父控制器(BaseController
),并定义一个受保护的字段(internal protected HttpSessionStateBase SharedSession
),该字段可以在所有子控制器中公开共享的会话变量(假设您的所有应用程序控制器都继承自BaseController
)。 - Bellash[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
文件中注册它。这是ASP.NET和ASP.NET MVC中会话状态的工作方式:
基本上,你可以使用以下方法将值存储在Session对象中:
Session["FirstName"] = FirstNameTextBox.Text;
获取数值的方法:
var firstName = Session["FirstName"];
BaseController
,并定义一个受保护的字段(internal protected HttpSessionStateBase SharedSession
),该字段可以在所有子控制器中公开共享的Session
变量(这假设您所有的应用程序控制器都继承自BaseController
)。 - Bellash您可以使用以下方法在会话中存储任何类型的数据:
Session["VariableName"]=value;
这个变量将持续大约20分钟。
您可以将任何值存储在会话中,例如 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"; 现在您可以在应用程序的任何地方访问这个全名。