Wie übergebe ich Parameter an eine Teilansicht in ASP.NET MVC?


93

Angenommen, ich habe diese Teilansicht:

Your name is <strong>@firstName @lastName</strong>

die nur durch ein Kind zugänglich ist Aktion wie:

[ChildActionOnly]
public ActionResult FullName(string firstName, string lastName)
{

}

Und ich möchte diese Teilansicht in einer anderen Ansicht verwenden mit:

@Html.RenderPartial("FullName")

Mit anderen Worten, ich möchte in der Lage sein, Vorname und Nachname von Ansicht zu Teilansicht zu übergeben. Wie soll ich das machen


Antworten:


77

Verwenden Sie diese Überladung ( RenderPartialExtensions.RenderPartialauf MSDN ):

public static void RenderPartial(
    this HtmlHelper htmlHelper,
    string partialViewName,
    Object model
)

so:

@{Html.RenderPartial(
    "FullName",
    new { firstName = model.FirstName, lastName = model.LastName});
}

1
Nun, ich habe es versucht, aber ich erhalte die beste überladene Methodenübereinstimmung für 'System.Web.WebPages.WebPageExecutingBase.Write (System.Web.WebPages.HelperResult)' hat einen ungültigen Argumentfehler . Wie soll ich die Controller-Methode implementieren? Sollte es Eingabeparameter haben?
Saeed Neamati

18
Sie haben also einen solchen Parameter übergeben. Wie greifen Sie in der Teilansicht darauf zu?
Burjua

9
Sie brauchen auch keine Klammern. @Html.Partial()ist das gleiche wie @{Html.RenderPartial();}aber viel schöner. Sie haben die gleichen Überlastungen.
smdrager

7
Wie greifen Sie auf das Objekt zu? Model.firstNameund ihre gleichen werfen eine Ausnahme, dassobject doesn't have a 'firstName' property
Asche999

4
@ ashes999 können Sie über ViewData zugreifen ... aber helfen Sie dabei, Ordnung zu schaffen, indem Sie einfach ein Modell erstellen, das für Ihre Verwendung spezifisch ist. Verwenden Sie es einmal und einige mögen es als einen Wurf betrachten, aber verwenden Sie es öfter als das und es ist ein Kinderspiel.
Ted

83

Hier ist eine andere Möglichkeit, dies zu tun, wenn Sie ViewData verwenden möchten:

@Html.Partial("~/PathToYourView.cshtml", null, new ViewDataDictionary { { "VariableName", "some value" } })

Und um die übergebenen Werte abzurufen:

@{
    string valuePassedIn = this.ViewData.ContainsKey("VariableName") ? this.ViewData["VariableName"].ToString() : string.Empty;
}

Vielen Dank, Ihre Antwort hat es geschafft, ohne ein Modell dafür zu erstellen.
Alvarodms

Von allen Beispielen ist dies das einzige, das für mich vollständig funktioniert hat. danke
BrianLegg

Das habe ich gesucht, kein Modell. danke :)
Anupam Roy

Ausgezeichnete Antwort - aber mit MVC 4 verwenden Sie Html.RenderPartial anstelle von Html.Partial
Graham Laight

24

Sie müssen ein Ansichtsmodell erstellen. So etwas sollte reichen ...

public class FullNameViewModel
{
     public string FirstName { get; set; }
     public string LastName { get; set; }

     public FullNameViewModel() { } 

     public FullNameViewModel(string firstName, string lastName)
     {
          this.FirstName = firstName;
          this.LastName = lastName;
     }

}

Übergeben Sie dann aus Ihrem Aktionsergebnis das Modell

return View("FullName", new FullNameViewModel("John", "Doe"));

und Sie können darauf zugreifen @Model.FirstNameund @Model.LastNameentsprechend.


13

Stellen Sie sicher, dass Sie {} um Html.RenderPartial hinzufügen, als:

@{Html.RenderPartial("FullName", new { firstName = model.FirstName, lastName = model.LastName});}

nicht

@Html.RenderPartial("FullName", new { firstName = model.FirstName, lastName = model.LastName});

1
Wie sieht die Definition Ihrer Teilansicht aus? Was ist die @ model-Deklaration? Es ist anonym ...
Elisabeth

Ja, stellen Sie sicher, dass Sie hinzufügen { }, ich habe Zeit verschwendet, bis ich diesen Artikel gefunden habe
Shaijut

4

Folgendes funktioniert für mich auf dotnet 1.0.1 :

./ourView.cshtml

@Html.Partial(
  "_ourPartial.cshtml",
  new ViewDataDictionary(this.Vi‌​ewData) {
    {
      "hi", "hello" 
    } 
  }
);

./_ourPartial.cshtml

<h1>@this.ViewData["hi"]</h1>

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.