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?


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

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

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.


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

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>

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.