Jak przekazać parametry do częściowego widoku w ASP.NET MVC?

94

Załóżmy, że mam taki częściowy pogląd:

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

który jest dostępny tylko poprzez działanie dziecka, takie jak:

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

}

Chcę użyć tego częściowego widoku w innym widoku z:

@Html.RenderPartial("FullName")

Innymi słowy, chcę mieć możliwość przekazywania firstName i lastName z widoku do częściowego widoku. Jak mam to zrobić?

Saeed Neamati
źródło
Bardzo blisko powiązane pytanie: stackoverflow.com/questions/1909134/ ...
Chris Moschini

Odpowiedzi:

78

Użyj tego przeciążenia ( RenderPartialExtensions.RenderPartialw witrynie MSDN ):

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

więc:

@{Html.RenderPartial(
    "FullName",
    new { firstName = model.FirstName, lastName = model.LastName});
}
David Wick
źródło
1
Cóż, próbowałem tego, ale otrzymuję dopasowanie Najlepszej przeciążonej metody dla `` System.Web.WebPages.WebPageExecutingBase.Write (System.Web.WebPages.HelperResult) '' ma błąd nieprawidłowych argumentów . Jak zaimplementować metodę kontrolera? Czy powinien mieć parametry wejściowe?
Saeed Neamati
19
Więc przekazałeś parametr w ten sposób, jak uzyskać do niego dostęp w częściowym widoku?
Burjua
9
Nie potrzebujesz też nawiasów. @Html.Partial()jest taki sam, @{Html.RenderPartial();}ale znacznie ładniejszy. Mają też takie same przeciążenia.
smdrager,
7
Jak uzyskujesz dostęp do obiektu? Model.firstNamei ich podobni rzucają wyjątek, któryobject doesn't have a 'firstName' property
ashes999
4
@ ashes999, do którego możesz uzyskać dostęp za pośrednictwem ViewData ... ale pomóż w utrzymaniu porządku, po prostu tworząc model dostosowany do Twojego zastosowania. Użyj go raz, a niektórzy mogą uznać to za rzut do góry, ale używaj go więcej razy i jest to oczywiste.
Ted,
85

Oto inny sposób, aby to zrobić, jeśli chcesz użyć ViewData:

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

Aby pobrać przekazane wartości:

@{
    string valuePassedIn = this.ViewData.ContainsKey("VariableName") ? this.ViewData["VariableName"].ToString() : string.Empty;
}
Garry English
źródło
Dzięki, Twoja odpowiedź załatwiła sprawę bez tworzenia odpowiedniego modelu.
alvarodms
Spośród wszystkich przykładów tylko ten w pełni zadziałał. dzięki
BrianLegg
Tego szukałem, żadnego modelu. dziękuję :)
Anupam Roy
Doskonała odpowiedź - ale w przypadku MVC 4 użyj Html.RenderPartial zamiast Html.Partial
Graham Laight
25

Musisz utworzyć model widoku. Coś takiego powinno wystarczyć ...

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

}

następnie z wyniku działania przekaż model

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

i będziesz mógł uzyskać dostęp @Model.FirstNamei @Model.LastNameodpowiednio.

simonlchilds
źródło
14

pamiętaj, aby dodać {} wokół Html.RenderPartial, jako:

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

nie

@Html.RenderPartial("FullName", new { firstName = model.FirstName, lastName = model.LastName});
BlackTigerX
źródło
1
Jak wygląda definicja Twojego widoku częściowego? Co to jest deklaracja @model? Jego anonimowe ...
Elisabeth
tak, koniecznie dodaj { },
straciłem
5

Następujące działa dla mnie w dotnet 1.0.1 :

./ourView.cshtml

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

./_ourPartial.cshtml

<h1>@this.ViewData["hi"]</h1>
lakesare
źródło
1

Właśnie:

@Html.Partial("PartialName", Model);
Cássio Batista Pereira
źródło