Comment passer des paramètres à une vue partielle dans ASP.NET MVC?

93

Supposons que j'ai cette vue partielle:

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

qui est accessible via une action enfant uniquement comme:

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

}

Et je veux utiliser cette vue partielle dans une autre vue avec:

@Html.RenderPartial("FullName")

En d'autres termes, je veux pouvoir passer firstName et lastName de la vue à la vue partielle. Comment dois-je faire ça?

Saeed Neamati
la source
Question très proche: stackoverflow.com/questions/1909134/...
Chris Moschini

Réponses:

77

Utilisez cette surcharge ( RenderPartialExtensions.RenderPartialsur MSDN ):

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

alors:

@{Html.RenderPartial(
    "FullName",
    new { firstName = model.FirstName, lastName = model.LastName});
}
David Wick
la source
1
Eh bien, j'ai essayé cela, mais j'obtiens La meilleure correspondance de méthode surchargée pour 'System.Web.WebPages.WebPageExecutingBase.Write (System.Web.WebPages.HelperResult)' a une erreur d' arguments invalides . Comment dois-je implémenter la méthode du contrôleur? Doit-il avoir des paramètres d'entrée?
Saeed Neamati le
18
Vous avez donc passé un paramètre comme celui-ci, comment y accédez-vous en vue partielle?
Burjua
9
Vous n'avez pas non plus besoin des crochets. @Html.Partial()est le même @{Html.RenderPartial();}mais beaucoup plus joli. Ils ont également les mêmes surcharges.
smdrager
7
Comment accédez-vous à l'objet? Model.firstNameet leurs semblables lancent une exception quiobject doesn't have a 'firstName' property
cendres999
4
@ ashes999 vous pouvez accéder via ViewData ... mais aidez à garder les choses en ordre en créant simplement un modèle spécifique à votre utilisation. Utilisez-le une fois et certains peuvent le considérer comme un tirage au sort, mais utilisez-le plus de fois que cela et c'est une évidence.
Ted
84

Voici une autre façon de le faire si vous souhaitez utiliser ViewData:

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

Et pour récupérer les valeurs passées:

@{
    string valuePassedIn = this.ViewData.ContainsKey("VariableName") ? this.ViewData["VariableName"].ToString() : string.Empty;
}
Garry anglais
la source
Merci, votre réponse a fait l'affaire sans créer de modèle pour cela.
alvarodms
De tous les exemples, c'est le seul qui a pleinement fonctionné pour moi. merci
BrianLegg
C'est ce que je cherchais, pas de modèle. merci :)
Anupam Roy
Excellente réponse - mais avec MVC 4, utilisez Html.RenderPartial au lieu de Html.Partial
Graham Laight
24

Vous devez créer un modèle de vue. Quelque chose comme ça devrait faire ...

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

}

puis à partir de votre résultat d'action, passez le modèle

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

et vous pourrez accéder @Model.FirstNameet en @Model.LastNameconséquence.

simonlchilds
la source
13

assurez-vous d'ajouter {} autour de Html.RenderPartial, comme:

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

ne pas

@Html.RenderPartial("FullName", new { firstName = model.FirstName, lastName = model.LastName});
BlackTigerX
la source
1
À quoi ressemble la définition de votre vue partielle? Qu'est-ce que la déclaration @model? Its anonymous ...
Elisabeth
oui assurez-vous d'ajouter { }, j'ai perdu du temps jusqu'à ce que je trouve cet article
shaijut
4

Ce qui suit fonctionne pour moi sur 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
la source
0

Juste:

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