asp.net-mvc – 持久化jqGrid列首选项

我有我的ASP.NET MVC 3应用程序有几个jqgrid有许多列。我添加以下到列定义认一些列隐藏:
colModel: [
   { name: 'IceCreamID',hidden: true},{ name: 'RecipeID',hidden: true }

这工作很好。这些列在我的网格上不可见。

然后我添加这个实现列选择器:

var grid = $('#icecreamGrid');
grid.jqgrid('navButtonAdd','#icecreamPager',{ caption: "Columns",buttonicon: "ui-icon-calculator",title: "Choose Columns",onClickButton: function() {
     grid.jqgrid('columnChooser');
  }
});

伟大,现在带来了列选择器。然后我添加以下列,我从来不想显示在列选择器:

colModel: [
   { name: 'IceCreamID',hidden: true,hidedlg: true},

所以我现在可以隐藏/显示列很好。现在,你将如何坚持这些信息? DB?作为一个cookie?另一种方式?有没有首选的方式来存储这种信息,真的是一个用户偏好,而不是与数据本身相关的东西?

更多信息

基于Oleg的以下评论,我想提供一些更多的信息。

这里的要点是,我有一个10-15列的网格,可以根据用户的偏好显示。对于一个简单的例子,我的一个网格有以下9列:

IceCream|ShortName|HasNuts|Sugaradded|LimitedRun|PromoItem|Facility|FirstRun|LastRun

用户可以根据个人偏好隐藏/显示这9列中的任何一列。

我想做的是提供一种方法来持久化特定用户想要查看的列,以便每次显示具有该网格的页面时,他/他不必重新选择要查看的列。

解决方法

我发现你的问题很有趣。关于保存网格的用户状态的问题在许多情况下是有趣的。在使用cookie的问题上有一些有趣的答案(例如 here)。

在我看来,在服务器或localStorage数据库中保存网格状态是更好的方式作为cookie的使用。最好的方法取决于项目的使用要求。例如,服务器上数据库存储的使用允许您实现网格的漫游状态。如果使用localStorage而不是cookie,则如果用户转到另一台计算机或者用户将在同一台计算机上使用另一个Web浏览器,则用户首选项将丢失。

电网状态的另一个问题是维护。有关通常在JavaScript或HTML文件中而不在数据库中保存的网格列的信息。在这种情况下,两个源可以不对网格中的变化同步。不同的更新问题的场景你可以轻松想象。然而,在一些情况下,用户偏好的优点如此大,以至于具有小缺点的问题不那么重要并且可以相对容易地解决

所以我将花一些时间来实现两个演示,演示如何实现。我在我的演示中使用localStorage,原因很多。我只提到两个从那里:

> Cookie是永久性地向服务器发送或从服务器发送不真实需要的不同信息的方式。它增加了HTTP头的大小,并降低了网站的性能(例如,参见here)。
> Cookie有非常严格的限制。对应于rfc2109的第6.3或rfc6265的6.1:每个cookie至少4096个字节,每个域至少50个cookie(rfc2109中20个),至少总共3000个cookie(rfc2109中的300个)。所以饼干不能用来保存太多的信息。例如,如果您要保存每个网页的每个网格的状态,您可以快速实现限制。

另一方面,所有现代浏览器都支持localStorage,IE8开始支持Internet Explorer(见here)。 localStorage将根据源(例如a1.example.com,a2.example.com,a3.example.com等)自动保存,并且每个源的任意限制为5 MB(参见here)。所以,如果你使用空间仔细,你将远离任何限制。

所以我在我的演示中使用了localStorage。我还应该提到,有一些插件jStorage使用localStorage,如果它是由浏览器支持,并使用另一个存储,但相同的接口为您在旧的浏览器,如IE6 / IE7的情况下。在这种情况下,您只有较小的存储容量:128 kB而不是5 MB,但它是更好的4K,有一个cookie(见here)。

现在关于实现。我创建两个演示:this和它的扩展版本:this

the first演示中,网格的以下状态将被保存,并在页面重新加载(大多数网络浏览器中的F5)中自动恢复:

>哪个列被隐藏
>列的顺序
>每列的宽度
>网格将被排序的列的名称和排序方向
>当前页码
>网格的当前过滤器和是否应用过滤器的标志。我在网格中使用multipleSearch:true设置。

以相同的方式,可以扩展(或减少)作为所保存的网格状态的一部分的选项列表。

从演示的代码的最重要的部分,你会发现如下:

var $grid = $("#list"),saveObjectInLocalStorage = function (storageItemName,object) {
        if (typeof window.localStorage !== 'undefined') {
            window.localStorage.setItem(storageItemName,JSON.stringify(object));
        }
    },removeObjectFromLocalStorage = function (storageItemName) {
        if (typeof window.localStorage !== 'undefined') {
            window.localStorage.removeItem(storageItemName);
        }
    },getobjectFromLocalStorage = function (storageItemName) {
        if (typeof window.localStorage !== 'undefined') {
            return $.parseJSON(window.localStorage.getItem(storageItemName));
        }
    },myColumnStateName = 'ColumnChooserAndLocalStorage.colState',saveColumnState = function (perm) {
        var colModel = this.jqgrid('getGridParam','colModel'),i,l = colModel.length,colItem,cmName,postData = this.jqgrid('getGridParam','postData'),columnsstate = {
                search: this.jqgrid('getGridParam','search'),page: this.jqgrid('getGridParam','page'),sortname: this.jqgrid('getGridParam','sortname'),sortorder: this.jqgrid('getGridParam','sortorder'),permutation: perm,colStates: {}
            },colStates = columnsstate.colStates;

        if (typeof (postData.filters) !== 'undefined') {
            columnsstate.filters = postData.filters;
        }

        for (i = 0; i < l; i++) {
            colItem = colModel[i];
            cmName = colItem.name;
            if (cmName !== 'rn' && cmName !== 'cb' && cmName !== 'subgrid') {
                colStates[cmName] = {
                    width: colItem.width,hidden: colItem.hidden
                };
            }
        }
        saveObjectInLocalStorage(myColumnStateName,columnsstate);
    },myColumnsstate,isColState,restoreColumnState = function (colModel) {
        var colItem,colStates,columnsstate = getobjectFromLocalStorage(myColumnStateName);

        if (columnsstate) {
            colStates = columnsstate.colStates;
            for (i = 0; i < l; i++) {
                colItem = colModel[i];
                cmName = colItem.name;
                if (cmName !== 'rn' && cmName !== 'cb' && cmName !== 'subgrid') {
                    colModel[i] = $.extend(true,{},colModel[i],colStates[cmName]);
                }
            }
        }
        return columnsstate;
    },firstLoad = true;

myColumnsstate = restoreColumnState(cm);
isColState = typeof (myColumnsstate) !== 'undefined' && myColumnsstate !== null;

$grid.jqgrid({
    // ... other options
    page: isColState ? myColumnsstate.page : 1,search: isColState ? myColumnsstate.search : false,postData: isColState ? { filters: myColumnsstate.filters } : {},sortname: isColState ? myColumnsstate.sortname : 'invdate',sortorder: isColState ? myColumnsstate.sortorder : 'desc',loadComplete: function () {
        if (firstLoad) {
            firstLoad = false;
            if (isColState) {
                $(this).jqgrid("remapColumns",myColumnsstate.permutation,true);
            }
        }
        saveColumnState.call($(this),this.p.remapColumns);
    }
});
$grid.jqgrid('navButtonAdd','#pager',{
    caption: "",title: "choose columns",onClickButton: function () {
        $(this).jqgrid('columnChooser',{
            done: function (perm) {
                if (perm) {
                    this.jqgrid("remapColumns",perm,true);
                    saveColumnState.call(this,perm);
                }
            }
        });
    }
});
$grid.jqgrid('navButtonAdd',buttonicon: "ui-icon-closethick",title: "clear saved grid's settings",onClickButton: function () {
        removeObjectFromLocalStorage(myColumnStateName);
    }
});

小心地在演示中将myColumnStateName(值“ColumnChooserAndLocalStorage.colState”)定义为不同页面上的不同值。

The second demo是第一个使用技术从我的old answer到你的另一个问题的扩展。演示使用搜索工具栏,并在高级搜索表单和搜索工具栏之间同步附加信息。

UPDATED:next answer包含上面代码的扩展版本。它显示如何附加地持久保存所选行(或行)。 Another answer显示如何持久化树网格的扩展节点的列表,并在页面重新编码时展开节点。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要讲解了“WPF如何实现带筛选功能的DataGrid”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“WPF...
本篇内容介绍了“基于WPF如何实现3D画廊动画效果”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这...
Some samples are below for ASP.Net web form controls:(from http://www.visualize.uk.com/resources/asp
问题描述: 对于未定义为 System.String 的列,唯一有效的值是(引发异常)。 For columns not defined as System.String, the only vali
最近用到了CalendarExtender,结果不知道为什么发生了错位,如图在Google和百度上找了很久,中文的文章里面似乎只提到了如何本地化(就是显示中文的月份)以及怎么解决被下拉框挡住的问题,谈
ASP.NET 2.0 page lifecyle ASP.NET 2.0 event sequence changed a lot since 1.1. Here is the order: App
静态声明: &#39; Style=&quot;position: relative&quot; AppendDataBoundItems=&quot;True&quot;&gt; (无 或 空 或
以下内容是从网络上搜集资料,然后整理而来的。不当之处,请不吝指教。(The following were from network, and edited by myself. Thanks in a
Imports System Imports System.Reflection Namespace DotNetNuke &#39;*********************************
Ok so you have all seen them: “8 million tools for web development”, “5 gagillion tools that if you
以下内容来源于: http://blog.csdn.net/cuike519/archive/2005/09/27/490316.aspx 问:为什么Session在有些机器上偶尔会丢失? 答:可能和
以下文章提到可以用“http://localhost/MyWebApp/WebAdmin.axd”管理站点: ---------------------------------------------
Visual Studio 2005 IDE相关的11个提高开发效率的技巧 英文原创来源于: http://www.chinhdo.com/chinh/blog/20070920/top-11-vis
C#日期格式化 from: http://51xingfu.blog.51cto.com/219185/46222 日期转化一 为了达到不同的显示效果有时,我们需要对时间进行转化,默认格式为:2007
from: http://www.nikhilk.net/UpdateControls.aspx Two controls that go along with the UpdatePanel and
Open the report in the Designer. In the ToolBox, select/expand the &quot;Report Items&quot; section.
from: http://drupal.org/node/75844 Do this: find which TinyMCE theme you are using. For the sake of
asp.net中给用户控件添加自定义事件 用户控件中定义好代理和事件: public delegate void ItemSavedDelegate(object sender, EventArgs
在Windows版本的Safari中浏览以下的页面。 http://www.asp.net/AJAX/Control-Toolkit/Live/Calendar/Calendar.aspx Calen
http://aspnet.4guysfromrolla.com/articles/021506-1.aspx By Scott Mitchell Introduction When creating