请考虑以下代码:
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();
}
答案 0 :(得分:3)
制作一些自定义的HtmlHelper扩展方法,只需写出隐藏文本元素和textbox元素。这样,您的视图标记仍然很简单,但您仍然可以在帖子信息中获得前/后状态跟踪。
我会偏离序列化选项: - /
答案 1 :(得分:1)
虽然我不知道如何解决你的问题,但我可以告诉你,你所想的将是非常不安全的。实际上,没有什么能阻止客户端改变通过请求发送的数据,并且在最好的情况下,在数据库中输入了无效数据。您不应该信任包含隐藏字段,查询字符串或包含您必须插入数据的cookie的客户端(除非您首先签署发送给客户端的数据并稍后检查签名)。