Come passare i parametri a una visualizzazione parziale in ASP.NET MVC?


93

Supponiamo che io abbia questa visione parziale:

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

accessibile solo tramite azioni come:

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

}

E voglio usare questa vista parziale all'interno di un'altra vista con:

@Html.RenderPartial("FullName")

In altre parole, voglio essere in grado di passare firstName e lastName dalla visualizzazione alla visualizzazione parziale. Come dovrei farlo?


Domanda molto strettamente correlata: stackoverflow.com/questions/1909134/…
Chris Moschini

Risposte:


77

Usa questo sovraccarico ( RenderPartialExtensions.RenderPartialsu MSDN ):

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

così:

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

1
Bene, l'ho provato, ma sto ottenendo la migliore corrispondenza del metodo sovraccarico per 'System.Web.WebPages.WebPageExecutingBase.Write (System.Web.WebPages.HelperResult)' ha qualche errore di argomenti non validi . Come devo implementare il metodo controller? Dovrebbe avere parametri di input?
Saeed Neamati

18
Quindi hai passato un parametro come questo, come accedervi in ​​vista parziale?
Burjua

9
Inoltre non hai bisogno delle parentesi. @Html.Partial()è uguale @{Html.RenderPartial();}ma molto più carino. Hanno anche gli stessi sovraccarichi.
smdrager

7
Come si accede all'oggetto? Model.firstNamee loro simili lanciano un'eccezione cheobject doesn't have a 'firstName' property
ashes999

4
@ ashes999 puoi accedere tramite ViewData ... ma aiuta a mantenere le cose in ordine semplicemente creando un modello specifico per il tuo utilizzo. Usalo una volta e alcuni potrebbero considerarlo un lancio, ma usalo più volte di così ed è un gioco da ragazzi.
Ted

84

Ecco un altro modo per farlo se vuoi usare ViewData:

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

E per recuperare i valori passati:

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

Grazie, la tua risposta ha funzionato senza creare un modello per questo.
alvarodms

Di tutti gli esempi, questo è l'unico che ha funzionato completamente per me. grazie
BrianLegg

Questo è quello che stavo cercando, nessun modello. grazie :)
Anupam Roy

Risposta eccellente - ma con MVC 4 usa Html.RenderPartial invece di Html.Partial
Graham Laight

24

È necessario creare un modello di visualizzazione. Qualcosa del genere dovrebbe funzionare ...

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

}

quindi dal risultato dell'azione passa il modello

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

e sarai in grado di accedere @Model.FirstNamee di @Model.LastNameconseguenza.


13

assicurati di aggiungere {} intorno a Html.RenderPartial, come:

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

non

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

1
Come appare la definizione della tua vista parziale? Cos'è la dichiarazione @model? È anonimo ...
Elisabeth

sì assicurati di aggiungere { }, ho perso tempo finché non ho trovato questo articolo
shaijut

4

Di seguito funziona per me su dotnet 1.0.1 :

./ourView.cshtml

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

./_ourPartial.cshtml

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.