2010-09-30 59 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。

在我的系統中,即使在用戶選擇數百個項目的示例中,性能也不是問題。