Есть ли способ создать 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 }});
ОТВЕТ (ы): Похоже, что Крейг и я закончили тем, что нашли два отдельных синтаксиса, которые сделают работу. Я определенно предвзят в этом случае, но мне нравится идея сначала установить модель, а потом «украсить» ее.
new ViewDataDictionary(MyModelObject) { { "SomeDisplayParameter", true }, { "SomeOtherParameter", 3 }, { "SomeThirdParameter", "red" } };
new ViewDataDictionary(new ViewDataDictionary() { {"SomeDisplayParameter", true }})
{ Model = MyModelObject };
Конечно, я бы все еще крутил свои колеса без его [в конечном итоге точечного] ответа, поэтому круг получает квадрат.