维护Viewstate

时间:2011-08-10 13:18:59

标签: asp.net viewstate

我正在为我的工作制作一个事件管理系统,它的基本功能是允许我办公室的人员将新事件上传到系统,跟踪和编辑它们。

它在很大程度上是完整的,现在我正在清理系统并使其更加用户友好。我遇到的最大问题之一是维护视图状态。我目前正在使用一个搜索页面来过滤我的所有事件结果,用户可以按日期,日期范围,客户端等进行搜索,只要用户停留在页面上系统按预期工作并且所有搜索功能设置都保持不变就像他们一样。

有一些功能,例如编辑链接,用于打开编辑和保存事件的新页面(同一窗口)。这也按预期工作,我将一个queryString传递给页面,告诉系统要编辑哪一个。问题是后退按钮。如果我使用的链接只链接到搜索页面,我会松开所有设置,如果你想看到你刚刚对事件所做的更改,那就有点烦人了,我尝试了一个JavaScript后台来维护你的viewstate而不是页面不刷新,因此在用户刷新之前不会显示任何编辑。

我有3次在这个页面上使用外部链接,虽然它不是一个交易破坏者,只是有点讨厌我想弄清楚,因为它一直困扰我。我也尝试在页面中进行编辑,但无法轻松解决这个问题,我认为这样更容易修复。

感谢您的阅读,希望有人可以指出我正确的方向,我是ASP.net的新手,我相信任何有用的信息!

1 个答案:

答案 0 :(得分:1)

Viewstate仅存在于当前表单的上下文中(它包含在隐藏的输入字段中)。这意味着Viewstate本身无济于事(任何时候你获得页面 - 不发布 - 它将有一个新的Viewstate)。但有一些选择。最简单的方法是使用Session来存储搜索查询的上下文(日期,日期范围,客户端等)。这存在于服务器端,可在加载页面时使用。维护搜索查询的另一种方法是利用浏览器维护历史记录的方式。您可以将哈希(#)代码添加到网址的末尾,然后可以通过javascript读取。 Backbone.js路由和历史记录功能以这种方式工作。但是,这是一个非常复杂的解决方案,因为它通常用于异步请求。这两种可能的选项都有一些注意事项(会话生命周期为会话cookie),但如果删除Viewstate(Page.EnableViewState = false),则会有一个小得多的请求/响应网络占用空间。

这是一些Backbone路由代码:

$(document).ready(function() {
    Backbone.history.start();
});

// create some routes
var DynamicWorkspace = Backbone.Router.extend({
        routes: {
            "search/:date": "search",
            "search/:date/:range": "search",
            "search/:date/:range/:client": "search"
        },

        search: function(date, range, client) {
            // make a request to your server with the queries
        }
    });

var dynamicRouter = new DynamicWorkspace;

var currentDate = '';
var currentRange = '';
var currentClient = '';

// call this via javascript from a page element
function setDate(value) {
    currentDate = value;
    return updateNavigation();
}

// call this via javascript from a page element
function setDateRange(value) {
    currentRange = value;
    return updateNavigation();
}

// call this via javascript from a page element
function setClient(value) {
    currentClient = value;
    return updateNavigation();
}

function updateNavigation() {
    // change the browser url to our known route
    dynamicRouter.navigate('search/' + currentDate + '/' + currentRange + '/' + currentClient, true);
    return false;
}