2013-03-01 7 views
24

Sto costruendo una pagina di profilo che avrà un numero di sezioni relative a un particolare modello (Tenant) - AboutMe, MyPreferences - questo tipo di cose. Ognuna di queste sezioni sarà una vista parziale, per consentire gli aggiornamenti parziali delle pagine usando AJAX.MVC 4 - come posso passare i dati del modello a una vista parziale?

Quando faccio clic su un ActionResult nel TenantController, sono in grado di creare una vista fortemente tipizzata ei dati del modello vengono passati alla vista fine. Non riesco a raggiungere questo obiettivo con visualizzazioni parziali.

Ho creato una vista parziale _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> 

Ho poi ho una visione MyProfile che renderà menzionato viste parziali:

@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> 

Se mi avvolgo il codice all'interno del DIV in _TenantDetailsPartial all'interno di @if(model != null){} non viene visualizzato nulla sulla pagina, quindi suppongo che sia passato un modello vuoto alla vista.

Come mai quando creo una vista fortemente tipizzata da un ActionResult l'utente nella "sessione" viene passato alla vista? Come può passare l'utente nella 'sessione' ad una vista parziale che non viene creata da un ActionResult? Se mi manca qualcosa sul concetto, per favore, spiega.

risposta

53

In realtà non si sta passando il modello al parziale, si passa un new ViewDataDictionary<LetLord.Models.Tenant>(). Prova questo:

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

sono davvero provato che in precedenza e non ha funzionato! Non devo ricostruire la mia soluzione ... Grazie, funziona. – MattSull

10

Inoltre, questo potrebbe rendere funziona:

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

o

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

Per ulteriori informazioni su RenderPartial e simili aiutanti HTML in MVC vedere this popular StackOverflow thread

4

Tre modi per passare i dati del modello alla vista parziale (potrebbero esserci minerale)

Si tratta di visualizzazione di una pagina

Metodo Uno Popola a vista

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

Metodo due Pass Through ViewBag

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

Metodo Tre passaggio attraverso il modello

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

enter image description here

+0

puoi inserire anche il codice di visualizzazione parziale.non sto ottenendo nulla quando usato il secondo metodo per passare il valore alla vista parziale –

+0

@HeemanshuBhalla Penso che var countries = ViewBag.CountryList come elenco può darti il ​​valore –