這主要是理論上的問題,因爲我實際上可以以任何方式實現它,但它讓我困惑了一下。因此,假設我向用戶提供一個頁面來選擇一個Excel文件,然後將其上傳到服務器。服務器代碼解析文件,並向用戶顯示具有多個選項的另一個頁面。用戶可以選擇和取消選擇其中的一些,編輯名稱,然後單擊確定 - 之後服務器必須僅處理選定的選項。在第二頁上編輯一個大的導入文件
的問題可能是:
- 是它更好地解析的文件存儲在會議?
- 將解析的數據推送到客戶端的頁面然後接收回來會更好嗎?
這裏的例子:
public class Data
{
public string Name { get; set; } // shown to user, can be changed
public bool Selected { get; set; } // this is in ViewModel but anyway
public string[] InternalData { get; set; } // not shown to user
}
// 1st option is to receive data via POST
public ActionResult ImportConfirmed(IList<Data> postitems)
{
// 2nd option is to receive only user changes via POST
var items = Session["items"] as IList<Data>;
items = items.Where(postitems of same name selected);
items.ForEach(set name to postitems name);
}
顯然選項#2具有副作用少,因爲它不具有全局狀態。但是在選項#1中,我們不會將大量無用的用戶數據推送給客戶端。這可以是很多。
當然這個問題並不新鮮,而且一如既往,答案是:這取決於。我不得不承認,我沒有任何確切的問題。我甚至不知道爲什麼我不喜歡只需要幾行代碼的Session解決方案。我問的原因是我已經閱讀了關於的概念,並且印象非常深刻。所以,我試圖在ASP.NET MVC中發明類似的東西,但未能實現。因此,我想知道,是否有任何優雅的方式來處理這種情況?通過優雅的我意味着什麼,這並不表明它使用會話,使用方便,操作到期(清理會話,如果用戶不按最後的「保存」按鈕),等喜歡的東西:
var data = parse(filestream);
var confirmationPostData = ShowView("Confirm", data);
items = items.Where(confirmationPostData of same name selected);
items.ForEach(set name to confirmationPostData name);
這裏ShowView實際上發送GET,等待用戶的POST,然後返回。有點。我不堅持,我只是展現給我留下深刻印象的方式(在網絡鎖定中 - 如果我確實瞭解它的話)。
在這種情況下,每個人都使用Session嗎?還是有更好的方法(除了學習LISP,我已經開始調查,如果我可以應付)?也許,MVC v2中的異步操作呢?
更新:存儲在DB /臨時文件,它的工作原理。我有時用DB存儲。然而,這需要一種數據過期的方式,因爲用戶可能會放棄它(就像關閉瀏覽器一樣簡單)。我所要求的是:是否有一種經過驗證的優雅方式來解決它 - 而不是如何去做。一個建立在序列化之上的抽象,並不依賴於特定的DB /文件實現,就像這樣。
我同意,我會堅持數據到數據庫並顯示導入記錄和錯誤的摘要屏幕。用另一個屏幕檢索名稱並讓用戶選擇它作進一步處理,將內部數據保存在數據庫中。 – Decker97 2009-11-15 20:06:33
推送可能兆字節的數據到頁面有時是一個非常糟糕的主意。然後用戶只關閉瀏覽器(或崩潰) - 數據會永遠留在數據庫中嗎?是的,有辦法跟蹤它 - 我自己做 - 但是有沒有常見的方法或庫,以便一千個程序員不會每天都重複這個過程? – queen3 2009-11-15 20:21:52