【发布时间】:2010-10-11 02:45:31
【问题描述】:
有没有办法通过一行代码创建一个带有模型和附加属性的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 }));
我发现其他人使用same problem,但他们的解决方案与我发现的多线概念相同:使用模型创建一个离散的ViewDataDictionary,添加新参数并在@987654330 中使用它@调用。
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): 看起来 Craig 和我最终找到了两种可以完成工作的独立语法。在这种情况下,我肯定是有偏见的,但我喜欢先设置模型,然后再“装饰”它的想法。
new ViewDataDictionary(MyModelObject) { { "SomeDisplayParameter", true }, { "SomeOtherParameter", 3 }, { "SomeThirdParameter", "red" } };
new ViewDataDictionary(new ViewDataDictionary() { {"SomeDisplayParameter", true }})
{ Model = MyModelObject };
当然,如果没有他 [最终准确] 的回答,我仍然会旋转我的轮子,所以,圆得到了正方形。
【问题讨论】: