簡體   English   中英

ASP.NET MVC:如何通過線路保持orignal對象狀態

[英]ASP.NET MVC: How too keep orignal object state over the wire

請考慮以下代碼:

public ActionResult Edit(int id)
{
    return View(db.Foos.Single(x => x.Id == id));
}

當用戶提交更改時,我希望同時接收原始和當前對象值,以便更新代碼可以是:

Foo foo = db.Foos.Attach(current, original);
db.SubmitChanges();

我看到兩個選擇:

1)渲染包含原始值的多個隱藏輸入

<input type="hidden" name="original.A" value="<%= Model.A %> />
<input type="hidden" name="original.B" value="<%= Model.B %> />

<input type="text" name="current.A" value="<%= Model.A %>
<input type="text" name="current.B" value="<%= Model.B %>

並提交至:

public ActionResult Update(Foo current, Foo original)
{
    Foo foo = db.Foos.Attach(current, original);
    db.SubmitChanges();
}

2)在一個隱藏字段中使用一些序列化/反序列化

<input type="hidden" name="original" value="<%= Serialize(original) %> />

和sumbmit:

public ActionResult Update(Foo current, string original)
{
    Foo original = DeserializeFrom<Foo>(original);
    Foo foo = db.Foos.Attach(current, original);
    db.SubmitChanges();
}

還有其他選擇嗎? 或者使編寫此類代碼的工具更容易?

編輯:

更清楚......保持原始價值的想法是消除如果以這種方式編寫代碼時發生的額外選擇:

public ActionResult Update(Foo changed)
{
    Foo original = db.Foos.Single(x => x.Id == changed.Id);
    MyUtils.CopyProps(original, current);
    db.SubmitChanges();
}

制作一些自定義的HtmlHelper擴展方法,只需寫出隱藏和文本框元素。 這樣,您的視圖標記仍然很簡單,但您仍然可以在帖子信息中獲得前/后狀態跟蹤。

我會偏離序列化選項: - /

雖然我不知道如何解決你的問題,但我可以告訴你,你所想的將是非常不安全的。 實際上,沒有什么能阻止客戶端改變通過請求發送的數據,並且在最好的情況下,在數據庫中輸入了無效數據。 您不應該信任包含隱藏字段,查詢字符串或包含您必須插入數據的cookie的客戶端(除非您首先簽署發送給客戶端的數據並稍后檢查簽名)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM