0

我有一个发布到 Update() 函数的简单帐户更新表单。具有当前用户帐户信息的模型被传递到包含此表单的视图,因此这些字段会自动填写。

表格

@model SomeController.AccountModel
@using (Html.BeginForm("Update", "SomeController", FormMethod.Post)) {
    @Html.LabelFor(u => u.Username)
    @Html.TextBoxFor(u => u.Username)
    ...

每个属性都有备份,例如backupUsername,这样我就可以在数据库中搜索旧的并从中更新。

更新()

[HttpPost]
public ActionResult Update(AccountModel newInfo)
{
    System.Diagnostics.Debug.WriteLine(newInfo.backupUsername);
    return Something();
}

但是,当我提交表单时,会传入一个全新的模型,因为newInfo.backupUsername它是空白的。如何让相同的模型传回?

4

3 回答 3

2

您可以使用隐藏字段向 MVC 显示您保留了旧值,如下所示:

@Html.HiddenFor(x => x.Backupsomething)
于 2013-09-16T14:17:32.727 回答
1

我通常创建隐藏字段:

@model SomeController.AccountModel
@using (Html.BeginForm("Update", "SomeController", FormMethod.Post)) {
    @Html.HiddenFor(u => u.backupUsername)
    @Html.LabelFor(u => u.Username)
    @Html.TextBoxFor(u => u.Username)

这样,您在页面加载时填写该字段,但用户不会更改它,因此它在帖子中按原样传递。

于 2013-09-16T14:15:53.667 回答
1

总是会创建一个新模型- 由于 HTTP 是无状态的,因此视图模型不会在多个请求上自动持久化(无需手动使用会话状态或其他一些机制)。出现在 POST 操作中的模型是通过将表单中的字段绑定到该对象来创建的。如果字段不存在,则不会绑定任何内容。

您在这里有几个选择。第一个是将隐藏字段添加到您的视图中,以便模型绑定器将它们拾取:

@Html.HiddenFor(m => m.backupUsername)

但是请注意,这是不安全的,因为任何人都可以编辑 HTML 来操作此字段。如果您需要安全性,您要么必须对其进行散列/加密,要么再次从数据库中检索它。

于 2013-09-16T14:18:31.153 回答