我有一个简单的帐户更新表单,发布到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
为空。如何将相同的模型传回去?
答案 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来操作此字段。如果您需要安全性,则需要对其进行哈希/加密或再次从数据库中检索它。