2010-09-30 34 views
1

尽管这里有类似的问题,但没有给出完整的答案,所以我发布了一个新的答案。mvc - 在多页面网格中存储复选框状态

我有一个分页的网格 - jqgrid - 它每次都从服务器接收数据,N行(10,20等等,具体取决于用户选择)。网格行模型中有一个布尔值,它被转换为显示行中的复选框。

当用户选中复选框并导航到下一个网格页面时,复选框的状态显然会丢失。什么是保存它的最佳方法?我看到的两种可能性都完全满足我:

我可以将选中实例的ID保存到复选框单击的全局javascript对象中。因此,当获得新的数据集时,我可以迭代所有收到的实例,查找已经选择的实例。然而,这可能意味着很多javascript操作,并且最终用户可能会减速,如果有很多选定的实例。

我可以将选择存储在服务器上(会话,数据库,其他任何)。这种方式每次模型生成时,我都会用适当的值填充它的布尔参数。但是,这可能意味着当用户离开我的页面而不提交更改并返回时,记录状态将被恢复。我不确定这是否好。通常,我强烈反对在用户提交表单之前在服务器端存储任何内容。

那么,你会选择/提供什么?

我正在使用ASP.NET MVC 2.0,C#4.0,如果这很重要。

+0

Session的问题在于,如果服务器资源不足,它将受到垃圾回收处理。存储“ViewState”(见下文)不存在这个问题。 – awrigley 2010-10-02 08:52:51

回答

1

你的问题实质上是关于在不涉及邪恶webforms视图状态的ajax场景中保存状态。

但是,viewstate在用于保存正在处理的场景中的状态时(与提供假装网页为winform的方式相反),没有什么问题。所以,为什么不去两个世界的最佳选择,并将这些值存储在加密的隐藏字段中,这是一种精益,卑鄙,聪明的人的视图状态?

当您请求下一页数据时,请将已存在的“viewstate”(如果有)加上新检查的项目传回给服务器,解密服务器上的viewstate,查看里面的内容以及是否相关到下一页,添加新的检查项目列表,加密并将新的“视图状态”发回给用户。

我还没有这样做,所以它只是一个想法。但是,这在逻辑上是可行的,而且非常实用。我说我没有使用网格来完成这个任务,但是我已经完成了,并取得了巨大的成功,设计出了一个梦幻般的向导框架。

我的向导在用户填写表单时只保留其状态,并且只有在最后一步才能保持任何内容(如果有的话,取决于应用程序的要求)。

该框架基于史蒂夫桑德森的书中描述的向导,但扩展到无缝或无ajax工作。还有一个非常简单的API,用于从我的向导控制器派生的控制器。

,使这个视图状态的工作中的代码是从OnActionExecuting方法叫做:

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    var serialized = Request.Form["wizardData"];    
    if (serialized != null) // Form was posted containing serialized data 
    { 
     WizardData = (TModel)new MvcSerializer().Deserialize(serialized); 
    } 
} 

然后在的ViewResult返回给用户:

<%= Html.Serialize("wizardData", Model)%> 

在你的情况,因为你只是分页数据,您需要序列化并加密与wizardData对象相同的对象,并将其返回给JSON数据以存储在隐藏字段中的某个位置。

这有点含糊不清,因为向导不是分页数据的网​​格。但是,这些原则(本质上讲,推出自己的视图状态)确实适用于这两种情况。

+0

是的,但@Michael正在使用jqgrid,它不会发布这些复选框值。这不是传统的形式。他或@Credittricity的解决方案对我来说都是可以接受的。 – Ryan 2010-09-30 22:20:14

+0

我在考虑ajax形式,而不是传统的形式。我没有使用jqgrid,但在请求下一页数据时将数据返回到服务器并将加密字符串打包到JSON响应中应该是可行的。不过,如果其他人工作,我会退缩。我的想法的唯一好处是用户输入是加密的,所以它减少了潜在的攻击配置文件。 – awrigley 2010-10-01 08:34:16

1

我已经解决了这种情况,通过在下一页被选中时在隐藏div中写入'selected'复选框的列表。这样客户端维护选择列表,并且不需要服务器交互。另外,当用户最终提交页面时,我只需遍历可见页面中的所有复选框和隐藏的div。

在我的系统中,即使在用户选择数百个项目的示例中,性能也不是问题。