发布到控制器时,部分viewmodel为null

时间:2018-06-09 22:32:00

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

我有一个包含其他视图模型的视图模型。

public class AggregateVM
{
    public BrandVM BrandVM { get; set; }
    public TinTypeVM TinTypeVM { get; set; }
}

当我发布到控制器操作的http时,TinTypeVM会填充我编辑的值,但我使用partial的BrandVM视图模型始终为null。

这是视图。

@model SaveEF.ViewModels.AggregateVM
@using (Html.BeginForm("EditAggregate", "Aggregate")) 
{
    @Html.Partial("_EditBrand", Model.BrandVM)

    @Html.Label("Tin Name")
    @Html.EditorFor(model => model.TinTypeVM.Name)
    <input type="submit" value="Save" />
}

这是部分视图。

@model SaveEF.ViewModels.BrandVM
@Html.Label("Brand Name")
@Html.EditorFor(model => model.Name)

这是控制器的动作。

public ActionResult EditAggregate(AggregateVM vm)
{
    SaveBrand(vm.BrandVM);
    SaveTinType(vm.TinTypeVM);
    return RedirectToAction("Index");
}

如何在视图中使用partials并仍然将单个视图模型传递给EditAggregate操作?我在Html.BeginForm(&#34; EditAggregate&#34;,&#34; Aggregate&#34;,FormMethod.Post,new {vm = Model})中尝试了不同的参数但是没有帮助

1 个答案:

答案 0 :(得分:0)

简答

你也需要将AggregateVM传递给你的部分。

长答案

你现在的做法是:

@model SaveEF.ViewModels.BrandVM
@Html.EditorFor(model => model.Name)

因此,如果您要检查为编辑器生成的name将是Name。因此,当您发布时,MVC的默认模型绑定器将在视图模型中查找匹配的属性。但你认为模型是这样的:

public class AggregateVM
{
    public BrandVM BrandVM { get; set; }
    public TinTypeVM TinTypeVM { get; set; }
}

并且没有Name属性。

<强>修正

你也需要将AggregateVM传递给你的部分。

@model SaveEF.ViewModels.AggregateVM
@Html.EditorFor(model => model.BrandVM.Name)

现在编辑器的名称为BrandVM.Name。因此,当您发布时,默认模型绑定器将查找属性BrandVM.Name并找到它。因此它将填充它。

另一种方法是使用name自己指定@Html.Editor属性或传递属性。