2013-03-01 18 views
24

Buduję stronę profilu, która będzie miała kilka sekcji odnoszących się do konkretnego modelu (najemcy) - AboutMe, MyPreferences - tego rodzaju rzeczy. Każda z tych sekcji ma być częściowym widokiem, aby umożliwić częściowe aktualizacje strony przy użyciu AJAX.MVC 4 - w jaki sposób przekazać dane modelu do widoku częściowego?

Kiedy klikam na ActionResult w TenantController, jestem w stanie stworzyć mocno napisany widok, a dane modelu zostaną przekazane do grzywny widoku. Nie mogę tego osiągnąć przy częściowych widokach.

Utworzyłem częściowy widok _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> 

Mam następnie widok MyProfile że odda wspomniany częściowy widok:

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

Gdybym zawinąć kod wewnątrz DIV w _TenantDetailsPartial wewnątrz @if(model != null){} nic nie wyświetla się na stronie, więc domyślam się, że do widoku jest przekazywany pusty model.

Jak to się stało, że po utworzeniu mocno wpisanego widoku z ActionResult użytkownik "sesji" zostaje przekazany do widoku? W jaki sposób można przekazać użytkownika w "sesji" do częściowego widoku, który nie został utworzony z ActionResult? Jeśli brakuje mi czegoś na temat tej koncepcji, proszę wyjaśnij.

Odpowiedz

53

W rzeczywistości nie przekazujesz modelu do częściowej, mijasz new ViewDataDictionary<LetLord.Models.Tenant>(). Spróbuj tego:

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

I rzeczywiście próbował to wcześniej i to nie działa! Nie mogłem przebudować mojego rozwiązania ... Dzięki, działa. – MattSull

10

Ponadto, może to uczynić to działa:

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

lub

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

Aby uzyskać więcej informacji na temat renderPartial i podobnych pomocników HTML w MVC zobaczyć this popular StackOverflow thread

4

Trzy sposoby przekazywania danych modelu do widoku częściowego (może być m rudy)

To jest widok strona

Metoda pierwsza Populate na widok

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

Metoda druga Przełęcz Poprzez ViewBag

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

Sposób trzeci przechodzą przez modelu

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

enter image description here

+0

Czy możesz też podać kod częściowego widoku.nie uzyskuję niczego, gdy używana jest druga metoda przekazywania wartości do widoku częściowego –

+0

@HeemanshuBhalla Myślę, że var countries = ViewBag.CountryList jako listę może dać wartość –

Powiązane problemy