ASP.NET MVC会话用法

时间:2010-03-10 13:32:23

标签: asp.net-mvc session persistence

目前我在ASP.NET MVC应用程序中使用ViewData或TempData作为对象持久性。

然而,在我通过我的基本控制器类将对象存储到ViewData的少数情况下,我在每次请求时都会访问数据库(当ViewData [“whatever”] == null时)。

将这些内容持续到具有更长寿命的东西(即会话)会很好。类似地,在订单处理管道中,我不希望在创建时将Order之类的东西保存到数据库中。我宁愿在内存中填充对象,然后当订单进入某个状态时,保存它。

所以会议似乎是最好的地方吗?或者你会建议在订单的情况下,在每个请求中从数据库中检索订单,而不是使用会话吗?

思考,建议表示赞赏。 谢谢 本

3 个答案:

答案 0 :(得分:4)

以为我会分享我在我的应用程序中使用session的方式。我非常喜欢使用会话的这种实现(Suggestions for Accessing ASP.NET MVC Session[] Data in Controllers and Extension Methods?),因为它可以轻松地将会话替换为另一个商店或用于测试目的。

查看实现,它让我想起了我在其他项目中使用的ObjectStore,它将对象序列化为二进制或xml,并存储在数据库或文件系统中。

因此我简化了我的界面(以前T必须是一个班级),并提出以下内容:

public interface IObjectStore {
    void Delete(string key);
    T Get<T>(string key);
    void Store<T>(string key, T value);
    IList<T> GetList<T>(string key);
}

我的会话商店实施:

public class SessionStore : IObjectStore
{      
    public void Delete(string key) {
        HttpContext.Current.Session.Remove(key);
    }

    public T Get<T>(string key) {
        return (T)HttpContext.Current.Session[key];
    }

    public void Store<T>(string key, T value) {
        HttpContext.Current.Session[key] = value;
    }

    public IList<T> GetList<T>(string key) {
        throw new NotImplementedException();
    }
}

然后我在我的基本控制器的构造函数中接受一个I​​ObjectStore,然后可以像这样使用它来向我的其他控制器公开属性:

   public string CurrentCustomer {
        get {
            string currentCustomer = 
                sessionStore.Get<string>(SessionKeys.CustomerSessionKey);
            if (currentCustomer == null) {
                currentCustomer = Guid.NewGuid().ToString();
                sessionStore.Store<string>(SessionKeys.CustomerSessionKey, currentCustomer);
            }
            return currentCustomer;               
        }
    }

对这种方法非常满意。

答案 1 :(得分:2)

我相信这就是Session的目的 - 临时存储会话特定数据。

然而,由于与使用Session相关的复杂性增加,即使可以忽略不计 - 在我自己的ASP.NET MVC项目中,我决定在每个订单创建步骤页面上访问数据库(仅在步骤之间传递ID) 。我准备优化并开始使用会话,因为我会发现每个请求的额外数据库命中都是性能瓶颈。

答案 2 :(得分:1)

您可以序列化您希望保留的内容并将其放在隐藏的输入字段中,例如WebForms中的ViewState。

以下是一篇可以帮助您入门的文章:http://weblogs.asp.net/shijuvarghese/archive/2010/03/06/persisting-model-state-in-asp-net-mvc-using-html-serialize.aspx