web-dev-qa-db-fra.com

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

J'ai un lien comme celui-ci:

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

et quand je clique dessus, on appelle cette page partielle:

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

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

    }
}

La page partielle _Profil 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 passer 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);
    }
144
neel

Votre question est difficile à comprendre, mais si je comprends bien, vous avez simplement une certaine valeur dans votre vue principale à laquelle vous souhaitez accéder dans un rendu partiel dans cette vue.

Si vous ne rendez qu'un partiel avec juste le nom partiel:

@Html.Partial("_SomePartial")

Il transmettra en fait votre modèle en tant que paramètre implicite, comme si vous appeliez:

@Html.Partial("_SomePartial", Model)

Maintenant, pour que votre partial puisse réellement l'utiliser, il lui faut aussi un modèle défini, par exemple:

@model Namespace.To.Your.Model

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

Si vous utilisez une valeur qui ne figure pas dans le modèle de votre vue (que ce soit dans le ViewBag ou une valeur générée dans la vue elle-même, vous pouvez alors passer un ViewDataDictionary

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

Puis:

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

Comme avec le modèle, Razor transmettra implicitement votre vue partielle à la vue ViewData par défaut. Par conséquent, si vous aviez ViewBag.Id, vous pouvez faire référence à la même chose dans votre vue partielle.

333
Chris Pratt

Une des méthodes les plus courtes que j'ai trouvées pour une valeur unique alors que je me cherchais moi-même est de simplement transmettre une chaîne unique et de définir une chaîne comme modèle à la 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 une vue partielle comme ceci

@model string

et l'utilisation de sa valeur en vue partielle comme celle-ci

@Model

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

J'espère que ça aide,

39
Osama Sheikh

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 suit:

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

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

Ensuite, dans votre vue partielle, vous pouvez utiliser ViewBag pour 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>
12
Chris Haines

Pour Asp.Net Core, vous feriez mieux d'utiliser

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

Donc par exemple

@foreach (var item in Model)
{
   <partial name="_MyItemView" model="item" />
}
0
Gerard