2014-01-16 13 views
19

Ich habe zwei Ansicht Modelle:Wie Modell zu Teilansicht passieren

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

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

Controller:

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

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

Und Ansichten: Index

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

und _Partial

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

Wenn ich versuche, Index-Seite zu öffnen ich einen Fehler habe:

Das Modellelement in das Wörterbuch übergeben ist vom Typ ‚ParentViewModel‘, aber dieses Wörterbuch erfordert ein Modell Artikel vom Typ ‚ChildViewModel‘.

Warum versucht, ParentViewModel anstelle von ChildViewModel übergeben. Was mache ich falsch?

+2

Beim Aufruf ist 'Model.Child initialisieren 'null? Da der zweite Parameter von 'Html.Partial' nicht' null' sein sollte ... Also, machen Sie aus, dass Ihre 'Child'-Eigenschaft einen gewissen Wert hat! – nemesv

+0

tatsächlich meine Teilansicht ist nur für AddObject-Funktionalität, so ChildViewModel nur zum Senden von Daten an den Controller von PartialView benötigt. Also müssen Sie keine Daten in Child vom Index an die Teilansicht übergeben. – DarkNik

+1

Immer noch müssen Sie ein ChildViewModel an den '@ Html.Partial' Aufruf übergeben. Es kann jedoch ein leeres Objekt sein: '@ Html.Partial (" _ Partial ", neues ChildViewModel())' ... – nemesv

Antwort

22

passieren muss ich das gleiche Problem wie die OP hatte. Von einer der Kommentare, erkannte ich, dass der zweite Parameter nicht null sein sollte, das heißt von

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

Wenn Model.Child null ist, dann Modell statt Model.Child geben wird. Wenn es Fälle gibt, in denen der zweite Parameter null ist, müssen Sie zuerst in Ihrem Code überprüfen und vielleicht ein initialisiertes Kind als zweiten Parameter weitergeben. So etwas wie dieses

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

Das hat bei mir funktioniert. Vielen Dank. – Ciwan

+0

Mit diesem Problem zu kämpfen, ohne ein Null-Kind zu realisieren, würde denselben Fehler zur Folge haben. Vielen Dank! –

13

Die Antwort ist, dass ein leeres Objekt nur teilweise, wie

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

Sie könnten PartialView("...") von einem Controller zurückkehren statt und die Aktion aus der Index-Ansicht aufzurufen.

Controller:

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"); 
} 

und Index

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

Alternativ könnten Sie ParentViewModel im Index() public Action Index()

{ 
    .... <some code> 
    return View("NewIndex", new ParentViewModel{Child = new ChildViewModel}); 
} 
Verwandte Themen