2011-08-24 11 views
36

Czy istnieje sposób przekazania części dodatkowych danych wraz z modelem do widoku częściowego?MVC3 - przekazywanie danych poza model do widoku częściowego

E.G.

@Html.Partial("_SomeTable", (List<CustomTable>)ViewBag.Table);

Czy to, co mam teraz. Czy mogę dodać coś innego bez zmiany mojego modelu?

@Html.Partial("_SomeTable", (List<CustomTable>)ViewBag.Table, "TemporaryTable");

widzę ViewDataDictionary jako param. Nie jestem pewien, co robi ten obiekt lub czy to odpowiada mojej potrzebie.

Odpowiedz

64

ViewDataDictionary może być użyty do zastąpienia słownika ViewData w częściowym widoku ... Jeśli nie przesyłasz parametru ViewDataDictionary, to dane view ofiary będą takie same jak parent.

Przykładem na to, jak wykorzystać go w dominującej jest:

@Html.Partial("_SomeTable", (List<CustomTable>)ViewBag.Table, new ViewDataDictionary {{ "Key", obj }}); 

Następnie w ciągu cząstkowe można uzyskać dostęp do tego obj następująco:

@{ var obj = ViewData["key"]; } 

Zupełnie inne podejście woud być w użyciu klasa Tuple, aby zgrupować zarówno oryginalny model, jak i dodatkowe dane w następujący sposób:

@Html.Partial("_SomeTable", Tuple.Create<List<CustomTable>, string>((List<CustomTable>)ViewBag.Table, "Extra data")); 

typ model cząstkowe będzie wówczas:

@model Tuple<List<CustomTable>, string> 

Model.Item1 daje obiektu List i Model.Item2 daje ciąg

+2

nie mogę zrozumieć składnię w 'nowej ViewDataDictionary {{ "klucz", obj}} '. Gdzie są nawiasy() w 'new ViewDataDictionary()' – Mahmoodvcs

+2

Są zbędne, gdy masz inicjator obiektu .. co jest tym kodem bezpośrednio po nowym ViewDataDictionary .. zobacz http://msdn.microsoft.com/pl -us/library/bb531208.aspx –

+1

'@ {var obj = ViewBag.Key; } 'działa również w celu uzyskania dostępu do przekazanych danych – MEC

7

Powinieneś być w stanie umieścić go w ViewBag, a następnie uzyskać do niego dostęp z ViewBag w częściowym widoku. See this SO answer.

2

Można dostać nawet mądry as shown here by Craig Stuntz

Html.RenderPartial("SomePartialView", null, 
    new ViewDataDictionary(new ViewDataDictionary() { {"SomeDisplayParameter", true }}) 
     { Model = MyModelObject }); 
5

I natknęli się również na tę kwestię. Chciałem mieć wielokrotnie odwzorowany kod i nie chciałem kopiować wklejek. Kod byłby nieco inny. Po przejrzeniu innych odpowiedzi nie chciałem iść tą dokładną trasą i zdecydowałem zamiast tego użyć zwykłego Dictionary.

Na przykład:

parent.cshtml

@{ 
var args = new Dictionary<string,string>(); 
args["redirectController"] = "Admin"; 
args["redirectAction"] = "User"; 
} 
@Html.Partial("_childPartial",args) 

_childPartial.cshtml

@model Dictionary<string,string> 
<div>@Model["redirectController"]</div> 
<div>@Model["redirectAction"]</div> 
Powiązane problemy