// 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;
}
}
此外,尝试使用显式的 Model
和 ModelState
组装 ViewDataDictionary
只会导致编译错误,因为 ModelState
是只读的。
// FAIL: Compilation error
this.Html.RenderPartial("SomePartialView", new ViewDataDictionary { Model = MyModelObject, ModelState = new ViewDataDictionary( new { SomeDisplayParameter = true }});
回答:看起来 Craig 和我找到了两种不同的语法来完成这项工作。在这种情况下,我肯定有偏见,但我喜欢先设置模型,然后再“装饰”它的想法。
new ViewDataDictionary(MyModelObject) { { "SomeDisplayParameter", true }, { "SomeOtherParameter", 3 }, { "SomeThirdParameter", "red" } };
new ViewDataDictionary(new ViewDataDictionary() { {"SomeDisplayParameter", true }})
{ Model = MyModelObject };
当然,如果没有他最终精准的答案,我仍将一直在原地打转,所以成功归功于他。