【问题标题】:Losing ViewModel Data after POSTPOST 后丢失 ViewModel 数据
【发布时间】:2012-03-19 23:52:06
【问题描述】:

我不经常看到这个问题,但我有一个使用布局的 .cshtml。在我得到的布局中:

@using (Html.BeginForm(null, null, FormMethod.Post, new { @class = "someCssClass", @id = "UserForm" }))
{
      ...rest of the code
}

我使用此布局的主 .cshtml 像往常一样在顶部定义了模型:

@model CarViewModel 
@{
    Layout = "~/Views/Shared/_CarLayout.cshtml";
}

当它返回到我的操作方法时,我得到模型的所有值的空值:

public ActionResult Cars(CarViewModel model)
{
    carBL.RemoveCars(model.CarIds, model.DealerId);
    ...
}

不确定我需要在这里做什么以及为什么会发生这种情况。通常我只是通过自动绑定成功取回它。在我看来,当模型通过标记中的 RAzor 使用时 - 使用返回的 ViewModel 可以很好地回发,但如果我不使用这些字段,它不会......所以我认为这就是它的工作原理,如果我不在标记中使用它们我需要将它们作为隐藏值发回然后强制持久化,因为我没有使用 ViewModel 中的 x 字段(如果我在表单中使用它们会自动持久化这些字段)?

【问题讨论】:

  • 好吧,我们需要看到... rest of the code,因为 Html.BeginForm 只是呈现表单。发送到操作(和绑定)的内容由表单的元素决定。

标签: asp.net-mvc asp.net-mvc-3


【解决方案1】:

如果值未绑定到表单字段,它们将返回 null。

在表单中使用以下内容,例如 ID 字段。

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

【讨论】:

  • 对,所以我的假设是,如果在表单标记中使用模型值,它们也会绑定到表单...
  • 那是正确的。没有“ViewState”或类似的东西。所以数据需要在表单中
  • 已接受答案但没有投票?你们很难取悦! +1 在这里... :)
  • 真的没有办法只是......泛泛地枚举所有隐藏的属性吗?当可以将新字段添加到模型中时,我很难对每个字段负责,如果表单没有保持全面,则会导致数据被清除。这肯定是一个普遍的问题。
【解决方案2】:

一个快速测试,看看表单是否被正确发布将修改你的动作签名:

public ActionResult Cars(FormCollection form)
{
    ...
}

如果form 未填充,则您的表单帖子有问题。另外,请注意,如果您愿意,可以在使用 FireBug、Chrome 开发工具或 Fiddler 等工具查看表单的发布数据时完成此操作。

如果表单正确发布,那么我应该检查以确保表单上输入字段的名称与您期望的 CarViewModel 的名称一致。

【讨论】:

    【解决方案3】:

    不确定这是否已经解决,但我就是这样做的(部分代码):

    @model MyProject.ViewModels.MyViewModel
    
    @using (Html.BeginForm())
    {
         <table>
              <tr>
                   <td>First Name:</td>
                   <td>@Html.TextBoxFor(x => x.FirstName, new { maxlength = "50" })
                       @Html.ValidationMessageFor(x => x.FirstName)
                   </td>
              </tr>
         </table>
    
         <button id="btnSave" type="submit">Save</button>
         <button id="btnCancel" type="button">Cancel</button>
    }
    

    然后是我处理HTTP post请求的action方法:

    [HttpPost]
    public ActionResult Create(MyViewModel viewModel)
    {
         // Check for null on viewModel
         // Do what needs to be done
    }
    

    这样做不会让您失去填写在表单/视图中的值。

    【讨论】:

    • 但这仅适用于 FirstName 属性。 viewModel.LastName 将是 null 因为它没有在视图中使用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多