加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 用于创建具有模型和ViewData项目的ViewDataDicti

发布时间:2020-12-15 18:46:30 所属栏目:asp.Net 来源:网络整理
导读:有没有办法创建具有模型的ViewDataDictionary和具有单行代码的其他属性。我正在组装模型和一些额外的显示配置属性,而不是在多行之间明确地组合ViewDataDictionary,来对强类型视图进行RenderPartial调用。似乎可能会给出RenderPartial重载同时使用一个模型
有没有办法创建具有模型的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 });

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读