有没有办法创建具有模型的ViewDataDictionary和具有单行代码的其他属性。我正在组装模型和一些额外的显示配置属性,而不是在多行之间明确地组合ViewDataDictionary,来对强类型视图进行RenderPartial调用。似乎可能会给出RenderPartial重载同时使用一个模型对象和一个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,添加新的参数并在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 };
当然,我仍然会旋转我的车轮,没有他的[最终现身]的答案,所以,圆圈得到广场。
解决方法
使用
object initializer和收集初始化器:
new ViewDataDictionary(new ViewDataDictionary() { {"SomeDisplayParameter",true }}) { Model = MyModelObject }
内部ViewDataDictionary获取其集合初始化,然后使用构造函数重载填充“真实”ViewDataDictionary,该重构使用ViewDataDictionary而不是对象。最后,对象初始化器设置模型。
然后只需传递整个事物,而不要单独设置MyModelObject:
this.Html.RenderPartial("SomePartialView",null,new ViewDataDictionary(new ViewDataDictionary() { {"SomeDisplayParameter",true }}) { Model = MyModelObject });