发布到控制器时,部分视图模型为空

Partial viewmodel is null when posting to controller

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

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

当我 http post 到控制器操作时,TinTypeVM 填充了我编辑的值,但我使用部分的 BrandVM 视图模型始终为空。

这是风景。

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

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

简答

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

长答案

您现在的做法是:

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

因此,如果您要检查为编辑器生成的 name 将是 Name。因此,当您 post 时,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。因此,当您 post 时,默认模型活页夹将查找 属性 BrandVM.Name 并找到它。因此它将填充它。

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