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

Saeed Neamati
quelle
Sehr eng verwandte Frage: stackoverflow.com/questions/1909134/…
Chris Moschini

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});
}
David Wick
quelle
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;
}
Garry Englisch
quelle
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.

simonlchilds
quelle
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});
BlackTigerX
quelle
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>
Seen sind
quelle
0

Gerade:

@Html.Partial("PartialName", Model);
Cássio Batista Pereira
quelle