我正在使用(ASP.Net MVC4),我陷入了如何从局部视图中获取信息的问题。 我的意思是我有一个我的viewmodel
public class ShowHomeViewModel
{
public int ID_ClientTypeID { get; set; }
public string ReservationDate { get; set; }
public short ClientNum { get; set; }
public string ClientPhone { get; set; }
public List<HomeViewModel> ReservedHuts { get; set; }
}
我有一个部分视图,我在HomeViewModel中显示所有de数据,它显示很棒,问题是当我尝试从视图中恢复ReservedHuts列表时:
@model HutReservation.ViewModel.ShowHomeViewModel
<table>
<tr>
@{Html.RenderPartial("_Reservations", Model.ReservedHuts);}
</tr>
</table>
在我的视图中,我显示了列表并更改了一些数据,但是当我单击按钮并转到新方法时,事实证明,ReservedHuts(HomeViewModel列表)为空
[HttpPost] //cambiar la pagina para el partial view
public ActionResult New(ShowHomeViewModel vm) // <- this vm is null
{
foreach (HomeViewModel hvm in vm.ReservedHuts)
{
}
return View("ConfirmNew", vm);
}
我真的被困在这里,谢谢你的帮助
答案 0 :(得分:0)
此处的问题是您的表单数据无法绑定到ShowHomeViewModel
。这是因为在渲染部分时模型的上下文已更改(模型上下文已从ShowHomeViewModel更改为HomeViewModel)。默认情况下,MVC使用约定来绑定属性(如果愿意,可以使用自己的模型绑定器,它使用您想要绑定的任何方法)。默认情况下,当您创建模型的EditorFor
属性时,MVC会将表单字段命名为适当的,以便它可以绑定回创建它的模型上下文。
因此,如果您跳过partial,您可以在父视图中运行foreach,并且您仍然可以绑定到ShowHomeViewModel
,因为它会将表单字段命名为:
<input name="ReservedHuts_HutId">
但是,如果使用partial并更改模型上下文,它将呈现相同的输入:
<input name="HutId">
因此,MVC不能(默认情况下)将HutId
的值绑定到ShowHomeViewModel
,因为没有名为HutId
的属性(但HomeViewModel上有HutId属性,因此它将绑定成功!)