Razor MVC模型正在丢失Save动作的数据

jaf*_*ffa 11 asp.net-mvc razor

我有一个使用TextBoxFor的文本框,其中包含数据.

我有一个模型的ID和一些其他基本数据,但直接显示在视图中的标签.

当我提交表单时,只有文本框字段包含模型上的数据,其他所有内容都为空,包括Id.这意味着它不会保存到数据库中.

什么会导致所有字段与文本框分开?

Ric*_*lay 16

这是Web工作的方式,只有表单元素与表单一起提交,而标签不是表单元素.

这里经常发生的是你:

  1. 渲染包含Id 的隐藏字段(Html.Hidden/ Html.HiddenFor)以及文本框
  2. 接受控制器操作中的更改(作为参数或对象)
  3. 从您的存储库/数据库中水合Id表示的对象的实例
  4. 将更改应用于水合实例
  5. 验证对象的状态并更新您的存储库/数据库(或者您计划使用它执行的任何操作)

由于发布的数据类由于缺少属性([Required]例如标记为)而经常"无效" ,因此创建仅具有更改属性的新类(称为"命令模型")非常常见.此类可以拥有自己的验证属性,因此不会影响表单验证.


tva*_*son 6

仅将输入发回服务器.如果您希望根据页面上的数据填充模型,则它们必须位于输入(或URL的一部分)中.标签元素中的数据不会使用表单发布到服务器(这是标准的HTML表单行为).通常,您使用隐藏字段回发不可编辑的模型数据,或者只是引用模型ID并从数据库重新填充,更新可编辑属性(如下所示).

例:

 @(using Html.BeginForm( new { id = Model.ID } ))
 {
       <p>
           <label>Fixed Property:</label>
           @Model.SomeFixedProperty
       </p>
       <p>
          @Html.LabelFor( m => m.EditableProperty )
          @Html.TextBoxFor( m => m.EditableProperty )
       </p>
}
Run Code Online (Sandbox Code Playgroud)

调节器

[HttpPost]
public ActionResult Foo( int id, string editableProperty )
{
    var model = repo.GetById( id );
    model.EditableProperty = editableProperty;
    repo.Save();
    return View( model );
}
Run Code Online (Sandbox Code Playgroud)