Shorthand para criar um ViewDataDictionary com um modelo e itens ViewData?
Existe alguma maneira de criar umViewDataDictionary
com um modelo e propriedades adicionais com uma única linha de código. Estou tentando fazer umRenderPartial
chame para uma visualização fortemente digitada ao montar o modelo e algumas propriedades de configuração de exibição extras sem montar explicitamente o ViewDataDictionary em várias linhas. Parece que seria possível, dado oRenderPartial
sobrecarga tomando um modeloobject
eViewDataDictionary
mas parece que simplesmente ignora oViewDataDictionary
sempre que ambos estiverem preenchido
// 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 }));
Encontrei outra pessoa com omesmo problem, mas a solução é o mesmo conceito de várias linhas que encontrei: crie umViewDataDictionary
com o modelo, adicione o (s) novo (s) parâmetro (s) e use-o noRenderPartial
ligar
var SomeViewData = new ViewDataDictionary(MyModelObject);
SomeViewData.Add("SomeDisplayParameter", true);
this.Html.RenderPartial("SomePartialView", SomeViewData);
Sempre posso agrupar essa lógica em umChainedAdd
método que retorna um dicionário duplicado com o novo elemento adicionado, mas parece que estou perdendo uma maneira de criar umViewDataDictionary
que faria isso por mim (e isso é um pouco mais caro do que eu esperava
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;
}
}
Como bem, tentando montar umViewDataDictionary
com um @ explíciModel
eModelState
simplesmente causa um erro de compilação porque o ModelState é somente leitur
// FAIL: Compilation error
this.Html.RenderPartial("SomePartialView", new ViewDataDictionary { Model = MyModelObject, ModelState = new ViewDataDictionary( new { SomeDisplayParameter = true }});
ANSWER (S): Parece que Craig e acabamos encontrando duas sintaxes separadas que farão o trabalho. Definitivamente, sou tendencioso nesse caso, mas gosto da ideia de definir o modelo primeiro e "decorá-lo" depoi
new ViewDataDictionary(MyModelObject) { { "SomeDisplayParameter", true }, { "SomeOtherParameter", 3 }, { "SomeThirdParameter", "red" } };
new ViewDataDictionary(new ViewDataDictionary() { {"SomeDisplayParameter", true }})
{ Model = MyModelObject };
Claro, eu ainda estaria girando minhas rodas sem a resposta dele (eventualmente), então o círculo fica perfeit