2009-11-15 47 views
0

這主要是理論上的問題,因爲我實際上可以以任何方式實現它,但它讓我困惑了一下。因此,假設我向用戶提供一個頁面來選擇一個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 /文件實現,就像這樣。

回答

2

我不確定上傳Excel文件的目的是什麼,但我喜歡讓所有影響用戶應用程序長期狀態的操作持續下去。例如,如果用戶上傳文件,更改了幾個選項,然後去吃午餐。如果將信息存儲在會話中,它們在返回時可能會消失,同樣用隱藏變量將其存儲在頁面中。把它存儲在數據庫中怎麼樣?

+0

我同意,我會堅持數據到數據庫並顯示導入記錄和錯誤的摘要屏幕。用另一個屏幕檢索名稱並讓用戶選擇它作進一步處理,將內部數據保存在數據庫中。 – Decker97 2009-11-15 20:06:33

+0

推送可能兆字節的數據到頁面有時是一個非常糟糕的主意。然後用戶只關閉瀏覽器(或崩潰) - 數據會永遠留在數據庫中嗎?是的,有辦法跟蹤它 - 我自己做 - 但是有沒有常見的方法或庫,以便一千個程序員不會每天都重複這個過程? – queen3 2009-11-15 20:21:52

0

我將文件存儲在臨時文件夾,只與用戶會話文件的名稱,以便以後可以處理相關聯:

// Create a temp file in the Temp folder and return its name: 
var tempFile = Path.GetTempFileName(); 
// write to the temp file and put the filename into the session 
// so that the next request can fetch the file and process it 

有與我曾經下跌GetTempFileName一大敗筆因爲我沒有仔細閱讀文檔。它說,如果臨時文件夾中有超過65535個文件,該方法將開始拋出異常。因此,請記得在完成處理後始終刪除臨時文件。

臨時文件夾的另一種替代方法是將文件存儲到數據庫中,但我對將文件存儲在關係數據庫中有點懷疑。

+0

查看更新。至於文件,正如我所說的,它是關於解析數據的,所以實際上要存儲數據結構 - 即IList 。但這並不重要。 – queen3 2009-11-15 20:30:00

相關問題