2012-03-19 112 views
3

我没有看到这个问题太频繁,但我有一个使用布局的.cshtml。在布局我有:POST后丢失ViewModel数据

@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); 
    ... 
} 

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

+1

那么我们需要看到......代码的其余部分,因为Html.BeginForm只是呈现窗体。发送到动作(和绑定)的内容取决于表单的元素。 – veblock 2012-03-20 00:00:08

回答

13

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

以下面的形式使用ID字段等内容。

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

正确,所以我的假设是,他们也被绑定到表单,如果模型值被用于表单标记... – PositiveGuy 2012-03-20 00:06:32

+0

这是正确的。没有“ViewState”或类似的东西。所以数据需要采用 – TheRealTy 2012-03-20 00:37:52

+1

接受的答案,没有upvotes?你们很难取悦! +1在这里:) :) – 2013-07-03 14:33:19

0

快速测试,以查看是否窗体被发布正确地将修改你的行动的签名:

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

如果form没有填充,那么你有一个问题与形式帖子。作为一方,请注意,如果您愿意,可以使用FireBug,Chrome Dev工具或Fiddler等工具查看表单的发布数据,从而实现此目的。

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

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 
} 

这样做不应该让你失去填写在表单/视图上的值。

+1

但是这只适用于FirstName属性。 viewModel.LastName将为null,因为它不在视图中使用? – SkeetJon 2013-11-28 11:31:52