2014-01-16 69 views
19

我有兩個視圖模型:如何模型傳遞到局部視圖

public class ParentViewModel 
    { 
     public Id { get; set; } 
     ..... 
     public ChildViewModel Child{ get; set; } 
    } 

public class ChildViewModel 
    { 
     public ChildId { get; set; } 
     ..... 
    } 

控制器:

public ActionResult Index() 
     { 
      .... <some code> 
      return View("NewIndex", ParentViewModel); 
     } 

    [HttpPost] 
    public ActionResult PartialAction(ChildViewModel childView) 
    { 
     return RedirectToAction("Index"); 
    } 

和看法: 指數

@model ParentViewModel 
.... 
@Html.Partial("_Partial", Model.Child) 

和_Partial

@model ChildViewModel 
... do some stuff with child model 

當我試圖打開索引頁,我得到了一個錯誤:

傳遞到字典的類型是「ParentViewModel」的模型項目,但本詞典需要類型的模型項目「ChildViewModel」。

爲什麼它會嘗試傳遞ParentViewModel而不是ChildViewModel。我做錯了什麼?

+2

致電時是'Model.Child 'null?因爲'Html.Partial'的第二個參數不應該是'null' ...所以讓你的'Child'屬性有一些價值! – nemesv

+0

實際上,我的Partial視圖僅適用於AddObject功能,因此ChildViewModel只需要從PartialView向控制器發送數據。因此,noot需要將索引中的數據傳遞給部分視圖 – DarkNik

+1

仍然需要將ChildViewModel傳遞給'@ Html.Partial'調用。但它可以是一個空對象:'@ Html.Partial(「_ Partial」,new ChildViewModel())'... – nemesv

回答

22

我有同樣的問題,因爲OP。從一個評論,我意識到,第二個參數不能爲空,即從

@model ParentViewModel 
@Html.Partial("_Partial", Model.Child) 

如果Model.Child爲null,則型號傳遞,而不是Model.Child。如果有第二個參數爲空的情況,那麼你必須首先檢查你的代碼,並且可能傳遞一個初始化的Child作爲第二個參數。這樣

@Html.Partial("_Partial", new Child()) 
+0

這對我有效。謝謝。 – Ciwan

+0

一直沒有意識到一個空的孩子會導致相同的錯誤。謝謝! –

13

答案是,需要一個空的對象傳遞給部分,像

@Html.Partial("_Partial", new ChildViewModel()) 
0

東西,你可以從一個Controller,而不是返回PartialView("..."),並要求從索引視圖的操作。

控制器:

public ActionResult Index() 
{ 
    .... <some code> 
    return View("NewIndex", ParentViewModel); 
} 

public ActionResult Partial(ChildViewModel cvm) 
{ 
    var vm = cvm ?? new ChildViewModel(); //if cvm from the parent view is null, return new cvm 
    return PartialView("_Partial", vm) //return partial view 
} 

[HttpPost] 
public ActionResult PartialAction(ChildViewModel childView) 
{ 
    return RedirectToAction("Index"); 
} 

和索引

@model ParentViewModel 
.... 
@Html.Action("Partial", Model.Child) 

或者,你可以在Index() 公衆的ActionResult指數()初始化ParentViewModel

{ 
    .... <some code> 
    return View("NewIndex", new ParentViewModel{Child = new ChildViewModel}); 
} 
相關問題