初始化语法:new ViewDataDictionary {{“Name”,“Value”}}

我正在寻找一种方法将ViewDataDictionary传递给ASP.NET MVC中的部分视图,我来到这个语法:

new ViewDataDictionary { { "Name", "Value" } } 

我对这里的初始化语法有点困惑。 任何人都可以向我解释一下吗?

ViewDataDictionary实现IDictionary

IDictionary本质上是KeyValuePair的集合。

您的ViewDataDictionary初始化程序(外部花括号)包含另一组花括号,表示KeyValuePair初始化程序。

在这个答案中解释了这是可能的原因。

您可以通过逗号分隔KeyValuePair初始值设定项来添加多个项目:

 var data = new ViewDataDictionary { { "Name", "Value" }, { "Name2", "Value2" } }; 

与…一样:

 var data = new ViewDataDictionary { new KeyValuePair("Name", "Value"), new KeyValuePair("Name2", "Value2") }; 

本质上,内部花括号是初始化KeyValuePair对象的很好的语法。

我用扩展方法解决了这个问题:

 ///  /// Use this extension method to create a dictionary or objects /// keyed by their property name from a given container object ///  /// Anonymous name value pair object ///  public static Dictionary ToDictionary(this object o) { var dictionary = new Dictionary(); foreach (var propertyInfo in o.GetType().GetProperties()) { if (propertyInfo.GetIndexParameters().Length == 0) { dictionary.Add(propertyInfo.Name, propertyInfo.GetValue(o, null)); } } return dictionary; } 

还有一个Html Helper扩展:

 ///  /// When viewData is null, we just return null. Otherwise, we /// convert the viewData collection to a ViewDataDictionary ///  /// HtmlHelper provided by view /// Anonymous view data object ///  public static ViewDataDictionary vd(this HtmlHelper htmlHelper, object viewData) { if (viewData == null) return null; IDictionary dict = viewData.ToDictionary(); //We build the ViewDataDictionary from scratch, because the // object parameter constructor for ViewDataDictionary doesn't // seem to work... ViewDataDictionary vd = new ViewDataDictionary(); foreach (var item in dict) { vd[item.Key] = item.Value; } return vd; } 

使用剃刀文件:

 @Html.Partial("~/Some/Path.cshtml", Model, Html.vd(new { SomeKey = SomeObj }))