Asp.net mvc ASP.NET MVC:如何在线保持原始对象状态

Asp.net mvc ASP.NET MVC:如何在线保持原始对象状态,asp.net-mvc,linq-to-sql,Asp.net Mvc,Linq To Sql,考虑以下代码: 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"

考虑以下代码:

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 %>
2) 在一个隐藏字段中使用一些序列化/反序列化

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

制作一些定制的HtmlHelper扩展方法,只需写出隐藏和文本框元素。这样,视图标记保持简单,但仍然可以在帖子信息中获得前/后状态跟踪


我会偏离序列化选项:-/

创建一些定制的HtmlHelper扩展方法,这些方法只需写出隐藏元素和textbox元素。这样,视图标记保持简单,但仍然可以在帖子信息中获得前/后状态跟踪


我会偏离序列化选项:-/

虽然我不知道如何解决您的问题,但我可以告诉您,您所想的是非常不安全的。事实上,没有什么可以阻止客户端更改通过请求发送的数据,在最好的情况下,在数据库中输入无效数据。你不应该用隐藏的字段、查询字符串或包含你必须插入的数据的Cookie来信任客户(除非你先对发送给客户的数据进行签名,然后再检查签名)。

虽然我不知道如何解决你的问题,但我可以告诉你,你所想的是非常不安全的。事实上,没有什么可以阻止客户端更改通过请求发送的数据,在最好的情况下,在数据库中输入无效数据。您不应将隐藏字段、查询字符串或包含您必须插入的数据的cookie信任给客户端(除非您首先对发送给客户端的数据进行签名,然后再检查签名)。

实际上,标准HtmlHelper已经有Html.hidden和Html.TextBox。但是,你可能是指一些使用反射生成隐藏列表的助手吗?我实际上是指创建一个新的扩展方法,它位于Html.Hidden和Html.TextBox旁边,它只是简单地聚合这些方法,以简化这样一个事实,即您必须为每个要显示的属性创建一个隐藏和文本框。这样,您的视图只显示类似于“Html.EditField”的内容,它将在Html标准的HtmlHelper中呈现一个隐藏的和文本框,而Html.hidden和Html.textbox已经存在。但是,你可能是指一些使用反射生成隐藏列表的助手吗?我实际上是指创建一个新的扩展方法,它位于Html.Hidden和Html.TextBox旁边,它只是简单地聚合这些方法,以简化这样一个事实,即您必须为每个要显示的属性创建一个隐藏和文本框。这样,您的视图就会显示类似于:“Html.EditField”的内容,它将在htmlI中同时呈现一个隐藏和文本框。我将允许用户提交任何他喜欢的值,所以我们的想法不是为了防止破解,只是为了消除对DB的额外查询。此外,您可以加密隐藏字段的值。然后它就像ASPXAUTH cookieI一样安全。我将允许用户提交他喜欢的任何值,所以这个想法不是为了防止破解,只是为了消除对DB的额外查询。此外,您可以加密隐藏字段的值。那么它就和ASPXAUTH饼干一样安全了
<input type="hidden" name="original" value="<%= Serialize(original) %> />
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();
}