有没有办法ViewDataDictionary
用一行代码创建一个模型和附加属性.我试图RenderPartial
在组装模型和一些额外的显示配置属性时调用强类型视图,而无需跨多行显式组装ViewDataDictionary.似乎有可能给出RenderPartial
一个模型object
和a 的重载,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(key, value)); } public static ViewDataDictionary ChainedAdd(this ViewDataDictionary source, KeyValuePair keyAndValue) { ViewDataDictionary NewDictionary = new ViewDataDictionary(source); NewDictionary.Add(keyAndValue); return NewDictionary; } }
同样,尝试ViewDataDictionary
使用显式组装a Model
并ModelState
简单地导致编译错误,因为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 };
当然,如果没有他的[最终定点]答案,我仍然会旋转我的车轮,所以,圆圈得到正方形.
使用对象初始值设定项和集合初始值设定项:
new ViewDataDictionary(new ViewDataDictionary() { {"SomeDisplayParameter", true }}) { Model = MyModelObject }
内部ViewDataDictionary初始化其集合,然后使用构造函数重载填充"真正的"ViewDataDictionary,该重载采用ViewDataDictionary而不是object.最后,对象初始化程序设置模型.
然后在不分别设置MyModelObject的情况下传递整个事物:
this.Html.RenderPartial("SomePartialView", null, new ViewDataDictionary(new ViewDataDictionary() { {"SomeDisplayParameter", true }}) { Model = MyModelObject });
使用Craig的答案作为起点 - 我甚至不知道你可以将构造函数调用和对象初始化程序结合起来 - 我偶然发现了Palermo的这个片段导致了一个有效的组合.他使用某种字典速记,以某种方式最终填充对象初始化器ModelState
消耗的时间ViewDataDictionary
.
new ViewDataDictionary(MyModelObject) { { "SomeDisplayParameter", true }, { "SomeOtherParameter", 3 }, { "SomeThirdParameter", "red" } }; // Of course, this also works with typed ViewDataDictionary objects (what I ended up using) new ViewDataDictionary(MyModelObject) { { "SomeDisplayParameter", true }, { "SomeOtherParameter", 3 }, { "SomeThirdParameter", "red" } };
鉴于您无法ModelState
在初始化程序中显式设置,我仍然看不到它最终如何工作,但它似乎保持原始模型对象和视图的"附加"参数.这个语法肯定有许多其他排列不起作用 - 您不能将模型与单个对象中的字典组合使用,或者使用对象初始化程序语法来表示字典值 - 但上述版本似乎有效.