Comment puis-je passer des paramètres à une vue partielle dans mvc 4


152

J'ai un lien comme celui-ci:

 <a href='Member/MemberHome/Profile/Id'><span>Profile</span></a>

et quand je clique dessus, il appellera cette page partielle:

 @{
    switch ((string)ViewBag.Details)
    {

        case "Profile":
        {
           @Html.Partial("_Profile"); break;
        }

    }
}

La page partielle _Profile contient:

Html.Action("Action", "Controller", model.Paramter) 

Exemple:

@Html.Action("MemberProfile", "Member", new { id=1 })   // id is always changing

Mon doute est que comment puis-je transmettre cet "Id" à la partie model.parameter ?

Mes contrôleurs sont:

 public ActionResult MemberHome(string id)
    {
        ViewBag.Details = id;
        return View();
    }
  public ActionResult MemberProfile(int id = 0)
    {
        MemberData md = new Member().GetMemberProfile(id);
        return PartialView("_ProfilePage",md);
    }

2
Je ne comprends pas. Peut-être que si vous ajoutez votre contrôleur et votre action, cela pourrait aider, mais comme il est écrit maintenant, je ne comprends pas votre question.
— Liam

voir à propos de l' extension partielle sur msdn
— Grundy

Réponses:


347

Votre question est difficile à comprendre, mais si j'obtiens l'essentiel, vous avez simplement une valeur dans votre vue principale à laquelle vous souhaitez accéder dans un rendu partiel dans cette vue.

Si vous effectuez juste un rendu partiel avec juste le nom partiel:

@Html.Partial("_SomePartial")

Il passera en fait votre modèle en tant que paramètre implicite, comme si vous deviez appeler:

@Html.Partial("_SomePartial", Model)

Maintenant, pour que votre partiel puisse réellement l'utiliser, il doit également avoir un modèle défini, par exemple:

@model Namespace.To.Your.Model

@Html.Action("MemberProfile", "Member", new { id = Model.Id })

Alternativement, si vous avez affaire à une valeur qui ne fait pas partie du modèle de votre vue (c'est dans le ViewBag ou une valeur générée dans la vue elle-même d'une manière ou d'une autre, vous pouvez passer un ViewDataDictionary

@Html.Partial("_SomePartial", new ViewDataDictionary { { "id", someInteger } });

Puis:

@Html.Action("MemberProfile", "Member", new { id = ViewData["id"] })

Comme pour le modèle, Razor transmettra implicitement à votre partiel la vue ViewDatapar défaut, donc si vous en aviez ViewBag.Iddans votre vue, vous pouvez référencer la même chose dans votre partiel.


4
Si vous faites en sorte que votre modèle principal implémente une interface, vous pouvez demander à la vue partielle d'utiliser cette interface comme modèle. Ensuite, vous pouvez en tirer beaucoup de réutilisation.
— Jess

@ChrisPratt Réponse très explicative comme toujours :) A voté +
— Murat Yıldız

6
J'ai dû utiliser @Html.Partial("_SomePartial", new Microsoft.AspNet.Mvc.ViewFeatures.ViewDataDictionary(this.ViewData) { { "id", someInteger } });pour que cela fonctionne pour moi. J'utilise VS2015 DNX 4.5.1 si quelqu'un d'autre a ce même problème.
— MikeTeeVee

46

L'une des méthodes les plus courtes que j'ai trouvées pour une valeur unique pendant que je cherchais moi-même, consiste simplement à passer une chaîne unique et à définir une chaîne comme modèle en vue comme ceci.

Dans votre côté appel partiel

@Html.Partial("ParitalAction", "String data to pass to partial")

Et puis lier le modèle avec vue partielle comme ceci

@model string

et l'utilisation de sa valeur dans la vue partielle comme ceci

@Model

Vous pouvez également jouer avec d'autres types de données comme array, int ou des types de données plus complexes comme IDictionary ou autre.

J'espère que ça aide,


4
C'est chouette! Exactement ce que je voulais. Merci.
— Gautam Jain

Mon partiel n'avait pas besoin de mon modèle, mais j'avais besoin de conserver tous les trucs de ViewData ModelState .. cela a fait l'affaire. Dans ma vue partielle, je peux toujours accéder à ViewContext.ViewData.ModelState.ContainsKey (@ Model.ToString ())
— da_jokker

Cela continue de lancer une NullReferenceExceptionréférence d'objet non définie sur une instance d'un objet, cela signifie que Modelc'est nul. Des idées?
— facepalm42

15

Voici une méthode d'extension qui convertira un objet en ViewDataDictionary.

public static ViewDataDictionary ToViewDataDictionary(this object values)
{
    var dictionary = new ViewDataDictionary();
    foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(values))
    {
        dictionary.Add(property.Name, property.GetValue(values));
    }
    return dictionary;
}

Vous pouvez ensuite l'utiliser dans votre vue comme ceci:

@Html.Partial("_MyPartial", new
{
    Property1 = "Value1",
    Property2 = "Value2"
}.ToViewDataDictionary())

Ce qui est bien plus agréable que la new ViewDataDictionary { { "Property1", "Value1" } , { "Property2", "Value2" }}syntaxe.

Ensuite, dans votre vue partielle, vous pouvez utiliser ViewBagpour accéder aux propriétés à partir d'un objet dynamique plutôt que des propriétés indexées, par exemple

<p>@ViewBag.Property1</p>
<p>@ViewBag.Property2</p>

Où dois-je mettre cette ToViewDataDictionaryméthode statique? Partout où j'essaie de le mettre, j'obtiens une sorte d'erreur de compilation.
— Csaba Toth

2
@CsabaToth c'est une méthode d'extension. Placez-le simplement dans une classe statique, puis référencez cette classe dans votre vue.
— Chris Haines

3

Pour Asp.Net core, mieux vaut utiliser

<partial name="_MyPartialView" model="MyModel" />

Donc par exemple

@foreach (var item in Model)
{
   <partial name="_MyItemView" model="item" />
}
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.