2014-03-14 70 views
1

我正在使用(ASP.Net MVC4),并且我被困在如何从部分视图中获取信息。 我的意思是我有我的视图模型从PartialView获取数据MVC4

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所有德数据的局部视图,它展现的伟大,问题是当我尝试从视图中恢复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

你PartialView需要被正被调回形式内再现。是这样吗?发布一些呈现的HTML。 – ps2goat

+0

如果你想异步返回到服务器以达到你的'New'方法,你将不得不使用AJAX – Jonesopolis

+1

向我们展示你的部分视图...在那里,我们应该看看你在做什么你的名单,如果你的表格还行。 – Romias

回答

0

这里的问题是,您的表单数据不能绑定到ShowHomeViewModel。这是因为在渲染局部时(模型上下文已从ShowHomeViewModel更改为HomeViewModel),模型的上下文已更改。 MVC默认使用约定来绑定属性(如果您愿意,您可以创建自己的模型绑定器,它使用任何想要绑定的方法)。在默认情况下,当您为模型创建一个EditorFor属性时,MVC将命名适当的表单域,以便它可以绑定回创建它的模型上下文。

所以,如果你跳过的部分,你可以只运行在父视图您的foreach,你很可能仍然绑定到ShowHomeViewModel因为它将命名表单字段是这样的:

<input name="ReservedHuts_HutId"> 

但是,如果您使用的部分,并更改模型方面,将呈现这样相同的输入:

<input name="HutId"> 

因此,MVC不能(默认)绑定的HutIdShowHomeViewModel价值,因为没有物业叫HutId(但对HomeViewModel HutId属性,所以它会成功绑定!)

+0

我环顾四周,寻找更深入的文章。这个很不错:http://www.codeproject.com/Articles/551576/ASP-NET-MVC-Model-Binding-and-Data-Annotation – solidau