web-dev-qa-db-fra.com

MVC 4 - comment passer des données de modèle à une vue partielle?

Je crée une page de profil qui comportera un certain nombre de sections liées à un modèle particulier (locataire) - AboutMe, MyPreferences - ce genre de choses. Chacune de ces sections sera une vue partielle, pour permettre des mises à jour partielles des pages à l'aide d'AJAX.

Lorsque je clique sur un ActionResult dans le TenantController, je peux créer une vue fortement typée et les données du modèle sont transmises à la vue fine. Je ne peux pas y parvenir avec des vues partielles.

J'ai créé une vue partielle _TenantDetailsPartial:

@model LetLord.Models.Tenant
<div class="row-fluid">
    @Html.LabelFor(x => x.UserName) // this displays UserName when not in IF
    @Html.DisplayFor(x => x.UserName) // this displays nothing
</div>

J'ai alors une vue MyProfile qui rendra les vues partielles mentionnées:

@model LetLord.Models.Tenant
<div class="row-fluid">
    <div class="span4 well-border">
         @Html.Partial("~/Views/Tenants/_TenantDetailsPartial.cshtml", 
         new ViewDataDictionary<LetLord.Models.Tenant>())
    </div>
</div>

Si j'enveloppe le code dans le DIV dans _TenantDetailsPartial Dans @if(model != null){} rien ne s'affiche sur la page, donc je suppose qu'un modèle vide est passé à la vue.

Comment se fait-il que lorsque je crée une vue fortement typée à partir d'un ActionResult, l'utilisateur de la 'session' est passé à la vue? Comment passer l'utilisateur dans la 'session' à une vue partielle qui n'est pas créée à partir d'un ActionResult? Si je manque quelque chose sur le concept, veuillez expliquer.

30
MattSull

Vous ne passez pas réellement le modèle au Partiel, vous passez une new ViewDataDictionary<LetLord.Models.Tenant>(). Essaye ça:

@model LetLord.Models.Tenant
<div class="row-fluid">
    <div class="span4 well-border">
         @Html.Partial("~/Views/Tenants/_TenantDetailsPartial.cshtml", Model)
    </div>
</div>
60
Daniel Imms

En outre, cela pourrait le faire fonctionner:

@{
Html.RenderPartial("your view", your_model, ViewData);
}

ou

@{
Html.RenderPartial("your view", your_model);
}

Pour plus d'informations sur RenderPartial et les assistants HTML similaires dans MVC, voir ce thread StackOverflow populaire

12
lzlstyle

Trois façons de passer les données du modèle à une vue partielle (il peut y en avoir plus)

Ceci est la page de visualisation

Première méthode Remplir à la vue

@{    
    PartialViewTestSOl.Models.CountryModel ctry1 = new PartialViewTestSOl.Models.CountryModel();
    ctry1.CountryName="India";
    ctry1.ID=1;    

    PartialViewTestSOl.Models.CountryModel ctry2 = new PartialViewTestSOl.Models.CountryModel();
    ctry2.CountryName="Africa";
    ctry2.ID=2;

    List<PartialViewTestSOl.Models.CountryModel> CountryList = new List<PartialViewTestSOl.Models.CountryModel>();
    CountryList.Add(ctry1);
    CountryList.Add(ctry2);    

}

@{
    Html.RenderPartial("~/Views/PartialViewTest.cshtml",CountryList );
}

Deuxième méthode Passer par ViewBag

@{
    var country = (List<PartialViewTestSOl.Models.CountryModel>)ViewBag.CountryList;
    Html.RenderPartial("~/Views/PartialViewTest.cshtml",country );
}

Troisième méthode passer par le modèle

@{
    Html.RenderPartial("~/Views/PartialViewTest.cshtml",Model.country );
}

enter image description here

5
Arun Prasad E S