为什么当我将视图中的 HTML 包装在"@using (Html.BeginForm(...))"块中时,我的模型为空?



请耐心等待,因为解释我所看到的问题可能相当困难,它正在炒我的大脑,因为它毫无意义(或者我缺少逻辑的一个关键组件)。

我有一个视图模型对象A,我正在将它从控制器传递给强类型视图B,该视图预期A的类型的模型。当我将视图B中的HTML封装在@using (Html.BeginForm(...))块中时(我尝试使用FormMethod.PostFormMethod.Get只是为了测试),运行时环境在运行到以下代码时抛出异常:

@for (int i = 0; i < Model.DataTable.Columns.Count; i++)

因为上面代码中的Model为空。我逐步完成了返回视图模型A到视图B的操作,以确保我没有传入空模型,并且我可以保证我没有。事实上,在某些行中,我使用LINQ生成HTML(例如,yFor(x=>x.Report.Name)) BEFORE the aforementioned用于`loop,这些行处理得很好。当我移除"封装块时,它工作正常。

关键是,几乎相同的代码在其他视图中与其他视图模型一起工作。我在另一个视图C中使用了相同风格的for循环,该视图期望视图模型D,并且它都封装在一个"块中,就像我试图使用AB一样。

编辑:这基本上就是它的样子。我希望这已经足够了。恐怕我不能再多付出了。

/* here is a very basic controller action */
[HttpGet]
public ActionResult View()
{
    ViewModel vm = new ViewModel();
    vm.Name = "view model test";
    vm.Table = new DataTable();
    return View(vm);
}
/* here is the view */
@model MyMVCProject.Models.ViewModel
@using (Html.BeginForm("View", "Controller", FormMethod.Post))
{
    <h2>Test for: </h2>
    @Html.DisplayFor(x => x.Name)
    <p>Rows</p>
    @for (int i = 0; i < Model.Table.Rows.Count; i++)
    {
        <p>@Model.Table.Rows[i].Name</p>
    }
    <input type="submit" value="OK"/>
}

啊。。。这太尴尬了。我确信编译器混淆了我的View操作和我在操作中返回的View类型。我重新命名了动作,一切都按预期进行。

最新更新