发布相同的模型传递给视图

时间:2013-09-16 14:13:14

标签: c# asp.net-mvc razor

我有一个简单的帐户更新表单,发布到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为空。如何将相同的模型传回去?

3 个答案:

答案 0 :(得分:2)

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

@Html.HiddenFor(x => x.Backupsomething)

答案 1 :(得分: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)

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

答案 2 :(得分:1)

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

这里有几个选项。第一种是在视图中添加隐藏字段,因此模型绑定器将拾取它们:

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

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