POST后丢失ViewModel数据

时间:2012-03-19 23:52:06

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

我没有经常看到这个问题,但我有一个使用布局的.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";
}

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

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

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

3 个答案:

答案 0 :(得分:13)

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

在表单中的

使用下面的ID字段之类的东西。

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

答案 1 :(得分:0)

快速测试,以查看表单是否正确发布将修改您的操作的签名:

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

如果未填充form,那么表单帖子就会出现问题。另外,请注意,如果您愿意,可以使用FireBug,Chrome Dev工具或Fiddler等工具查看表单的发布数据时完成此操作。

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

答案 2 :(得分:0)

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

@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请求:

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

这样做不应该让你失去表格/视图中填写的值。