首页 文章

ASP.NET MVC会话用法

提问于
浏览
2

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

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

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

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

思想,建议表示赞赏 . 谢谢本

3 回答

  • 4

    您可以序列化要保留的内容,并将其放在WebForms中的隐藏输入字段(如ViewState)中 .

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

  • 2

    只是想我会分享我在我的应用程序中使用session的方式 . 我非常喜欢使用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();
        }
    }
    

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

    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

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

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

相关问题