Czy istnieje sposób na utworzenie modelu ViewDataDictionary
z modelem i dodatkowymi właściwościami za pomocą pojedynczej linii kodu. Próbuję wykonać wywołanie RenderPartial
do mocno napisanego widoku, jednocześnie łącząc zarówno model, jak i niektóre dodatkowe właściwości konfiguracji wyświetlania, bez konieczności jawnego składania obiektu ViewDataDictionary w wielu wierszach. Wygląda na to, że byłoby to możliwe, biorąc pod uwagę przeciążenie RenderPartial
, przyjmując zarówno model object
, jak i ViewDataDictionary
, ale wygląda na to, że po prostu ignoruje ViewDataDictionary
, gdy oba są wypełnione.Skrócona instrukcja tworzenia obiektu ViewDataDictionary z elementami modelu i elementami ViewData?
// FAIL: This will result in ViewData being a ViewDataDictionary
// where Model = MyModelObject and there are no other parameters available.
this.Html.RenderPartial("SomePartialView", MyModelObject, new ViewDataDictionary(new { SomeDisplayParameter = true }));
znalazłem kogoś z same problem, ale ich rozwiązanie jest takie samo multi-line koncepcja znalazłem: tworzenie dyskretnego ViewDataDictionary
z modelem, dodać nowy parametr (-y) i używać go w zaproszeniu RenderPartial
.
var SomeViewData = new ViewDataDictionary(MyModelObject);
SomeViewData.Add("SomeDisplayParameter", true);
this.Html.RenderPartial("SomePartialView", SomeViewData);
zawsze mogę owinąć tej logiki w ChainedAdd
metody zwracającej duplikat słownik z nowego elementu dodanego ale to wydaje się mi brakuje jakiś sposób tworzenia ViewDataDictionary
że byłoby to zrobić dla mnie (i to jest nieco bardziej narzutowy, niż miałem nadzieję).
this.Html.RenderPartial("SomePartialView", new ViewDataDictionary(MyModelObject).ChainedAdd("SomeDisplayParameter", true));
public static ViewDataDictionaryExtensions {
public static ViewDataDictionary ChainedAdd(this ViewDataDictionary source, string key, object value) {
return source.ChainedAdd(new KeyValuePair<string,object>(key, value));
}
public static ViewDataDictionary ChainedAdd(this ViewDataDictionary source, KeyValuePair<string, object> keyAndValue) {
ViewDataDictionary NewDictionary = new ViewDataDictionary(source);
NewDictionary.Add(keyAndValue);
return NewDictionary;
}
}
Jak dobrze, starając się zebrać ViewDataDictionary
z wyraźną Model
i ModelState
prostu powoduje błąd kompilacji, ponieważ ModelState jest tylko do odczytu.
// FAIL: Compilation error
this.Html.RenderPartial("SomePartialView", new ViewDataDictionary { Model = MyModelObject, ModelState = new ViewDataDictionary(new { SomeDisplayParameter = true }});
ODPOWIEDŹ (S): Wygląda jak Craig i skończyło się na znalezieniu dwóch oddzielnych składnie, że dostanie pracę. Jestem zdecydowanie stronniczy w tym przypadku, ale podoba mi się pomysł ustawienia modelu i "dekorowania" go później.
new ViewDataDictionary(MyModelObject) { { "SomeDisplayParameter", true }, { "SomeOtherParameter", 3 }, { "SomeThirdParameter", "red" } };
new ViewDataDictionary(new ViewDataDictionary() { {"SomeDisplayParameter", true }})
{ Model = MyModelObject };
Oczywiście, wciąż obracałbym moje koła bez jego [ostatecznie celnej] odpowiedzi, tak, koło dostaje kwadrat.
To wydaje się tworzyć ViewDataDictionary z modelem równym anonimowemu obiektowi, a następnie zastępuje właściwość Model obiektem MyModelObject, nie pozostawiając żadnych dołączonych właściwości. Nauczyłem mnie, że mogę połączyć konstruktora z dodatkowymi inicjalizatorami; coś, czego nie wiedziałem - dzięki. – patridge
Właśnie sprawdziłem kod źródłowy. Ustawienie Model nie powoduje wyczyszczenia słownika. –
Zgadzam się; ustawienie modelu nie powoduje wyczyszczenia słownika. Ale nie ustawiasz słownika w tym kodzie.Tworzysz ViewDataDictionary z modelem anonimowego obiektu zawierającego właściwość SomeDisplayParameter. Następnie za pomocą inicjalizatora zmieniasz model na MyModelObject. – patridge