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);
    }
neel
la source
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.

Chris Pratt
la source
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,

Oussama Sheikh
la source
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>
Chris Haines
la source
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" />
}
Gérard
la source