当前位置:  开发笔记 > 前端 > 正文

使用模型和ViewData项创建ViewDataDictionary的简写?

如何解决《使用模型和ViewData项创建ViewDataDictionary的简写?》经验,为你挑选了2个好方法。

有没有办法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 ModelModelState简单地导致编译错误,因为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 };

当然,如果没有他的[最终定点]答案,我仍然会旋转我的车轮,所以,圆圈得到正方形.



1> Craig Stuntz..:

使用对象初始值设定项和集合初始值设定项:

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 });



2> patridge..:

使用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在初始化程序中显式设置,我仍然看不到它最终如何工作,但它似乎保持原始模型对象和视图的"附加"参数.这个语法肯定有许多其他排列不起作用 - 您不能将模型与单个对象中的字典组合使用,或者使用对象初始化程序语法来表示字典值 - 但上述版本似乎有效.

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有