16

Ich habe folgende benutzerdefinierte ActionResult erstellt, die mehrere Teilansichten zurückgibt.Angepasstes ActionResult-Modell für alle PartialViews

public class MultiplePartialViewsResult : ActionResult 
{ 
    private const string Separator = "-"; 
    private PartialViewResult[] _partialViews; 

    public MultiplePartialViewsResult(params PartialViewResult[] partialViews) 
    { 
     _partialViews = partialViews; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     foreach (var partialView in _partialViews) 
     { 
      partialView.ExecuteResult(context); 
      context.HttpContext.Response.Output.Write(Separator); 
     } 
    } 
} 

Und dann benutze ich es wie folgt:

return new MultiplePartialViewsResult(
      PartialView("~/Views/RowSumView.cshtml", new List<double>() { 1.0 }), 
      PartialView("~/Views/ColumnSumView.cshtml", new List<double>() { 2.0 })); 

Aber wenn ich Haltepunkt setzen in MultiplePartialViewsResult ‚s Konstruktor sehe ich, dass Modell in beiden Fällen gleich 2.0. Es überschreibt alle Modelle mit dem letzten in einem Array angegebenen Modell.

Versuchen Sie, paar PartialViews in der Methode zu erstellen und sie der Variablen zuzuweisen. Dann werden Sie bemerken, dass sie alle das gleiche Modell haben.

+1

Ja, es ist korrekt.Wenn Sie versuchen, zwei 'Modelle' zu ​​einer Ansicht zurückzugeben, erstellen Sie ein 'Ansichtsmodell', das beide zu sendenden Modelle enthält, und machen das Modell Ihrer Ansicht zum neuen' ViewModel' –

+0

Das ist der Punkt, den ich versuche, zu vielen Ansichten zurückzukehren.Idea basiert auf diesem Beitrag, wo der Autor angibt, dass Modelle unterschiedlich sein können. https://www.simple-talk.com/dotnet/asp.net/revisiting-partial-view-rendering-in-asp.net-mvc/ – Maximus

+1

Haben Sie die letzten Dinge überprüfen? Es wird gesagt, 'View-Modell' zu verwenden, das von beiden Seiten geteilt wird. –

Antwort

6

können Sie initialisieren die MultiplePartialViewsResult Objekt in der folgenden Weise mit neuen eigenenViewdata/ViewData.Model Instanzen (funktioniert gut für mich):

return new MultiplePartialViewsResult(
    //PartialView("~/Views/RowSumView.cshtml", new List<double>() { 1.0 }), 
    //PartialView("~/Views/ColumnSumView.cshtml", new List<double>() { 2.0 }) 
    new PartialViewResult() { ViewName = "~/Views/RowSumView.cshtml", ViewData = new ViewDataDictionary() { Model = new List<double>() { 1.0 } } }, 
    new PartialViewResult() { ViewName = "~/Views/ColumnSumView.cshtml", ViewData = new ViewDataDictionary() { Model = new List<double>() { 2.0 } } } 
); 

Custom Action Ergebnis:

public class MultiplePartialViewsResult : ActionResult { 
    private const string Separator = "-"; 
    private PartialViewResult[] _partialViews; 

    public MultiplePartialViewsResult(params PartialViewResult[] partialViews) { 
     _partialViews = partialViews; 
    } 

    public override void ExecuteResult(ControllerContext context) { 
     foreach(var partialView in _partialViews) { 
      partialView.ExecuteResult(context); 
      context.HttpContext.Response.Output.Write(Separator); 
     } 
    } 
} 

Controller:

public ActionResult Index() { 
    return View(); 
} 
public ActionResult FakeAction() { 
    return new MultiplePartialViewsResult(
     //PartialView("~/Views/RowSumView.cshtml", new List<double>() { 1.0 }), 
     //PartialView("~/Views/ColumnSumView.cshtml", new List<double>() { 2.0 }) 
     new PartialViewResult() { ViewName = "~/Views/RowSumView.cshtml", ViewData = new ViewDataDictionary() { Model = new List<double>() { 1.0 } } }, 
     new PartialViewResult() { ViewName = "~/Views/ColumnSumView.cshtml", ViewData = new ViewDataDictionary() { Model = new List<double>() { 2.0 } } } 
    ); 
} 

Aufrufe:

Index:

@Html.Action("FakeAction") 

ColumnSumView.cshtml/RowSumView.cshtml:

@model List<double> 
<ul> 
    @foreach(double item in Model) { 
     <li>@item</li> 
    } 
</ul> 
+0

Das ist ein Workaround, aber ich frage mich, warum mein Beispiel nicht funktioniert. Gibt es einen besseren Ansatz, um mehrere Teilansichten zu übergeben? – Maximus

+0

Es scheint, dass es sich auf das Halten eines ViewData/Model-Objekts beim Rendern einer PartialView bezieht (eine einzelne ViewData pro ActionResult). Möglicherweise ist dies ein erwartetes Verhalten. Ich werde versuchen zu überprüfen, ob es eine bessere Lösung gibt. Im Moment können Sie meinen vorgeschlagenen Ansatz verwenden und jedes ActionResult/PartialViewResult immer mit einer neuen ViewData/Model-Instanz initialisieren. – Mikhail

+3

Dies geschieht aufgrund der [PartialView] (https://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/Controller.cs) Helfer des Controllers, den Maximum verwendet, um jedes Teilergebnis zu erzeugen. Dieser Helfer wird das Modell in ViewData.Model festlegen, wobei ViewData eine Eigenschaft in [dem Controller] ist (https://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/ControllerBase.cs). Wenn Sie zweimal 'PartialResult' aufrufen, wird das ViewData.Model überschrieben –