123

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

我在 Internet 上到处寻找一个简单的分步教程,它可以向我展示如何在我的 C# ASP.NET MVC 4 应用程序中创建和使用会话。我想创建一个包含用户变量的会话,我可以从控制器中的任何位置访问它,并且能够在我的 LINQ 查询中使用这些变量。

4

5 回答 5

167

尝试

//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;
于 2013-01-03T12:34:45.343 回答
67

由于 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文件中注册它。

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

一句警告:

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

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

于 2013-12-20T11:50:37.787 回答
17

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

ASP.NET 会话状态概述

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

Session["FirstName"] = FirstNameTextBox.Text;

要检索值:

var firstName = Session["FirstName"];
于 2013-01-03T12:25:00.933 回答
0

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

Session["VariableName"]=value;

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

于 2018-10-30T22:55:50.760 回答
-8

您可以在会话中存储任何值,例如 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"; 现在你可以在应用程序的任何地方访问这个全名。

于 2016-04-20T14:03:19.350 回答