跨多個回發存儲對象的方法

asp.net entity-framework postback

為了論證,假設我有一個允許用戶編輯訂單詳細信息的webform。用戶可以執行以下功能:

  • 更改運費/付款詳情(所有簡單文字/下拉菜單)
  • 按順序添加/刪除/編輯產品 - 這是通過網格完成的
  • 添加/刪除附件

產品和附件存儲在單獨的DB表中,並帶有訂單的外鍵。

實體框架(4.0)用作ORM。

我想允許用戶對訂單進行任何他們想要的更改,並且只有當他們點擊“保存”時我才想將更改提交到數據庫。這不是文本框/複選框等問題,因為我可以依賴ViewState來獲取所需信息。然而,網格對我來說是一個更大的問題,因為我無法找到一種簡單明了的方法來持久保存用戶所做的更改,而無需將更改提交給數據庫。在Session / ViewState中存儲Order對象樹實際上並不是我想要的選項,因為對象可能變得非常大。

所以問題是 - 我怎樣才能保留用戶在準備好“保存”之前所做的更改。

快速注意 - 我搜索過SO試圖找到一個解決方案,但是我發現所有的建議都是使用Session和/或ViewState - 由於我的對象樹的潛在大小,我不想使用這兩個

一般承認的答案

如果使用Session不是您首選的解決方案,這可能是明智的,最好的解決方案是創建自己的臨時數據庫表(或者像其他人提到的那樣,在現有數據庫表中添加臨時標誌)並在那裡保存數據,在Session(或cookie)中存儲單個標識符以供以後檢索。


專家解答

你認為大到多大?如果你正在談論會話狀態 (所以它不會回到實際用戶,比如視圖狀態),那麼狀態通常是一個非常好的選擇。除了中狀態提供商都使用序列,但你可以影響它是如何序列化。例如,我會傾向於創建一個代表只是我關心(以及任何ID / rowversion信息),該操作(而不是全域實體,其中可能有額外的開銷)狀態的局部模型。

為了進一步減少序列化開銷,我會考慮使用protobuf-net之類的東西;這可以用作ISerializable的實現,允許非常輕量級的序列化對象(通常比BinaryFormatterXmlSerializer等小得多),在頁面請求時重建很便宜。

最後保存頁面時,我會從本地模型更新我的域實體並提交更改。

有關信息,要使用狀態序列化器(通常為BinaryFormatter )的protobuf-net屬性對象,您可以使用:

// a simple, sessions-state friendly light-weight UI model object
[ProtoContract]
public class MyType {
    [ProtoMember(1)]
    public int Id {get;set;}

    [ProtoMember(2)]
    public string Name {get;set;}

    [ProtoMember(3)]
    public double Value {get;set;}
    // etc

    void ISerializable.GetObjectData(
        SerializationInfo info,StreamingContext context)
    {
        Serializer.Serialize(info, this);
    }

    public MyType() {} // default constructor

    protected MyType(SerializationInfo info, StreamingContext context)
    {
        Serializer.Merge(info, this);
    }
}


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因