Есть ли способ создать ViewDataDictionary
с моделью и дополнительными свойствами с одной строкой кода. Я пытаюсь сделать вызов RenderPartial
строго типизированному представлению при сборке как модели, так и некоторых дополнительных свойств конфигурации дисплея без явной сборки ViewDataDictionary в нескольких строках. Похоже, что при перегрузке RenderPartial
можно было бы взять как модель object
, так и ViewDataDictionary
, но похоже, что она просто игнорирует ViewDataDictionary
, когда они оба заполнены.
// 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 }));
Я нашел кого-то другого с , но их решение - та же самая многострочная концепция, которую я нашел: создать дискретный ViewDataDictionary
с помощью модели, добавить новый параметр и использовать его в вызове RenderPartial
.
var SomeViewData = new ViewDataDictionary(MyModelObject);
SomeViewData.Add("SomeDisplayParameter", true);
this.Html.RenderPartial("SomePartialView", SomeViewData);
Я всегда могу перенести эту логику в метод ChainedAdd
, который возвращает дублированный словарь с добавленным новым элементом, но мне кажется, что мне не хватает какого-либо способа создания ViewDataDictionary
, который сделает это для меня (и что это немного больше накладных расходов, чем я надеялся).
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;
}
}
Кроме того, попытка собрать ViewDataDictionary
с явным Model
и ModelState
просто вызывает ошибку компиляции, потому что ModelState доступен только для чтения.
// FAIL: Compilation error
this.Html.RenderPartial("SomePartialView", new ViewDataDictionary { Model = MyModelObject, ModelState = new ViewDataDictionary( new { SomeDisplayParameter = true }});
ANSWER (S): Похоже, что Крейг и я нашли два отдельных синтаксиса, которые сделают работу. В этом случае я определенно предвзятый, но мне нравится идея сначала установить модель и "украсить" ее.
new ViewDataDictionary(MyModelObject) { { "SomeDisplayParameter", true }, { "SomeOtherParameter", 3 }, { "SomeThirdParameter", "red" } };
new ViewDataDictionary(new ViewDataDictionary() { {"SomeDisplayParameter", true }})
{ Model = MyModelObject };
Конечно, я все равно буду крутить колеса без его [в конечном счете спот-на] ответе, поэтому круг получает квадрат.