asp.net MVC Partial View Controller-Aktion

77

Ich bin sehr neu in der Entwicklung von Web-Apps und dachte, ich würde mit der neuesten Technologie beginnen. Deshalb versuche ich, asp.net und das MVC-Framework sofort zu lernen. Dies ist wahrscheinlich eine sehr einfache Frage für Sie, MVC-Profis.

Meine Frage ist, ob einer Teilansicht eine Aktion zugeordnet sein soll. Wenn ja, wird diese Aktion immer dann aufgerufen, wenn eine normale Seite RenderPartial()in der Teilansicht verwendet wird?

Yogi Bär
quelle

Antworten:

137

Während Sie eine Aktion haben können, die eine Teilansicht zurückgibt, benötigen Sie keine Aktion, um eine Teilansicht zu rendern. RenderPartial nimmt die Teilansicht und rendert sie unter Verwendung des angegebenen Modells und der Ansichtsdaten, falls angegeben, in die aktuelle (übergeordnete) Ansicht.

Möglicherweise möchten Sie eine Aktion, die eine Teilansicht zurückgibt, wenn Sie AJAX zum Laden / Neuladen eines Teils einer Seite verwenden. In diesem Fall ist es nicht erwünscht, die vollständige Ansicht zurückzugeben, da Sie nur einen Teil der Seite neu laden möchten. In diesem Fall kann die Aktion nur die Teilansicht zurückgeben, die diesem Abschnitt der Seite entspricht.

Standardmechanismus

Teilansicht in einer normalen Ansicht verwenden (keine Aktion erforderlich)

...some html...
<% Html.RenderPartial( "Partial", Model.PartialModel ); %>
...more html..

Ajax-Mechanismus

Neuladen eines Teils einer Seite über AJAX (Hinweis teilweise wird beim ersten Laden der Seite inline gerendert)

...some html...
<div id="partial">
<% Html.RenderPartial( "Partial", Model.PartialModel ); %>
</div>
...more html...

<script type="text/javascript">
   $(function() {
       $('#someButton').click( function() {
           $.ajax({
              url: '/controller/action',
              data: ...some data for action...,
              dataType: 'html',
              success: function(data) {
                 $('#partial').html(data);
              },
              ...
           });
       });
   });
</script>

Controller für AJAX

public ActionResult Action(...)
{
     var model = ...

     ...

     if (Request.IsAjaxRequest())
     {
          return PartialView( "Partial", model.PartialModel );
     }
     else
     {
          return View( model );
     }
}
Tvanfosson
quelle
Ich sehe, ich spiele nur mit der VS-Vorlage für eine MVC-App herum. Ich versuche, mehrere Listen von Clients beispielsweise in einer Teilansicht anzuzeigen. Ich habe derzeit eine Datenübertragungsmodellklasse. Wie würde ich dieses Modell an die Teilansicht senden, ohne die Seitenansicht einzubeziehen, die diese Teilansicht rendert? Danke für Ihre Hilfe!
Yogibear
1
Der Teil ist immer in der Hauptansicht enthalten. Das einzige Mal, dass Sie den Teil selbst zurückgeben würden, wäre, wenn Sie über AJAX aktualisieren würden. Vermutlich würden Sie einen Teil verwenden, um eine Liste von Clients anzuzeigen . Sie würden möglicherweise eine foreach-Schleife in Ihrer Ansicht verwenden, um die Listen (die im Ansichtsmodell enthalten sind) zu durchlaufen und jede als Modell an den Teil zu übergeben.
Tvanfosson
Wow sehr umfassende Antwort, danke tvanfosson!
Yogibear
Ein Rat ist die Verwendung von Url.Action, da eine solche Hardcodierung des Pfads die Anwendung bei Routenänderungen oder Änderungen der Kartenstruktur beschädigt.
Jean-Paul
3

Die akzeptierte Antwort ist völlig korrekt, aber ich möchte hinzufügen, dass Sie Ihre Teilansicht mit jQuery load laden können. Weniger Konfiguration erforderlich, wenn Sie die Parallelität nicht berücksichtigen möchten.

$("#Your-Container").load("/controller/action/id");
Saeid
quelle
1
Ein Rat ist die Verwendung von Url.Action, da eine solche Hardcodierung des Pfads die Anwendung bei Routenänderungen oder Änderungen der Kartenstruktur beschädigt.
Jean-Paul
Stimme dir voll und ganz zu @JpHouten.
Saeid
2

Die Antwort ist nein. Manchmal benötigen Sie jedoch eine Controller-Aktion hinter einer Teilansicht. Anschließend können Sie eine actionMethod erstellen, die eine Teilansicht zurückgibt. Diese actionMethod kann in einer anderen Ansicht aufgerufen werden:

@Html.Action("StockWarningsPartial", "Stores")

Die Aktionsmethode kann folgendermaßen aussehen:

public ActionResult StockWarningsPartial()
{
      ....              
      return View("StockWarningsPartial", warnings);

}

und die Ansicht 'StockWarningsPartial.cshtml' beginnt mit:

@{
    Layout = null;
}

damit Ihr umgebendes Layout nicht erneut gerendert wird.

Peter
quelle
2

Mit dieser Logik konnte ich etwas Ähnliches erreichen.

Innerhalb der .cshtml

@Html.Action("ActionMethodName", "ControllerName");

Innerhalb der Steuerung

[Route("some-action")]
public ActionResult ActionMethodName()
{
    var someModel = new SomeModel();
    ...
    return PartialView("SomeView.cshtml", someModel);
}

Und das ist es.

Wenn Sie Werte aus der CSC-Datei an die Aktionsmethode übergeben müssen, ist dies möglich.

Bern
quelle
1
Perfektes Beispiel. Sie haben die Interaktion und den Code sowohl im Controller als auch in der Ansicht sauber und klar auf den Punkt gebracht. Ohne den Flaum. Vielen Dank.
eaglei22