从Partial View MVC 4获取数据

时间:2014-03-14 00:06:32

标签: c# asp.net-mvc-4 razor partial-views

我正在使用(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);
    }

我真的被困在这里,谢谢你的帮助

1 个答案:

答案 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属性,因此它将绑定成功!)