发布到控制器时,部分视图模型为空
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
属性。
我有一个包含其他视图模型的视图模型。
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
属性。