如何缓存用户所做页面的更改?

时间:2017-05-10 14:54:45

标签: c# asp.net-mvc-4 outputcache

我使用OutputCacheAttribute来缓存整个页面。除非用户在页面上进行一些更改(例如检查一些复选框或在下拉列表中选择一些项目)并离开页面,否则一切正常。然后,当他返回到此页面时,他没有看到他在上次访问时所做的更改(选中复选框或下拉列表中的所选项目),因为它是从缓存中加载的第一个html标记页面。有没有办法缓存这种信息?

1 个答案:

答案 0 :(得分:0)

您需要使用localStorageOutputCache是服务器端,检查复选框等内容只存在于客户端,除非用户实际发布返回服务器。即使他们这样做,OutputCache也应该在param上有所不同,因此用户的帖子不会(也不应该)被缓存。

无论如何,您基本上只是绑定到这些表单元素的更改/单击事件,然后在localStorage中设置它们的值。例如:

$('#MyCheckBox').on('click', function () {
    localStorage.setItem('MyCheckBox', $(this).is(':checked'));
});

然后,在页面加载时,您可以从localStorage检索并重置值:

$(document).ready(function () {
    if (localStorage.getItem('MyCheckBox')) {
        $('#MyCheckBox').attr('checked', localStorage.getItem('MyCheckBox'));
    }
});

localStorage支持相当广泛的浏览器,但特定用户的浏览器仍可能不支持它。此外,localStorage需要用户的许可,因此可以被拒绝。 MDN has a helpful function检查您是否可以使用它:

function storageAvailable(type) {
    try {
        var storage = window[type],
            x = '__storage_test__';
        storage.setItem(x, x);
        storage.removeItem(x);
        return true;
    }
    catch(e) {
        return e instanceof DOMException && (
            // everything except Firefox
            e.code === 22 ||
            // Firefox
            e.code === 1014 ||
            // test name field too, because code might not be present
            // everything except Firefox
            e.name === 'QuotaExceededError' ||
            // Firefox
            e.name === 'NS_ERROR_DOM_QUOTA_REACHED') &&
            // acknowledge QuotaExceededError only if there's something already stored
            storage.length !== 0;
    }
}

此外,按字段处理此字段可能不太理想。你可能最好找一种抽象获取/设置逻辑的方法,这样你就可以将它用于多种输入和类型。也可能值得研究第三方库,例如jQuery PhoenixGarlicSisyphus,它们可以自动为您处理这些内容。