2013-09-04 20 views
20

szukałem sposobu, aby przejść ViewDataDictionary do częściowego widoku w ASP.NET MVC, że przyszedłem do tej składni:Initializer składnia: nowy ViewDataDictionary {{ „nazwa”, „wartość”}}

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

Jestem nieco zdezorientowany składni inicjatora tutaj. czy ktoś może mi to wyjaśnić?

+0

MSDN na inicjalizatorów zbiórki w [C#] (https://msdn.microsoft.com/en-us/library/bb384062.aspx) i [VB] (https://msdn.microsoft.com/en-us/library/dd293617.aspx) – KyleMit

Odpowiedz

40

ViewDataDictionary implementuje IDictionary<string, object>.

IDictionary<string, object> jest zasadniczo zbiorem KeyValuePair<string, object>.

Twój inicjator ViewDataDictionary (zewnętrzne nawiasy klamrowe) zawiera inny zestaw nawiasów klamrowych, który reprezentuje inicjator KeyValuePair<string, object>.

Przyczyna tego jest wyjaśniona w this answer.

Możesz dodać kilka pozycji przecinkiem rozdzielając KeyValuePair<string, object> inicjatorów:

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

samo jak:

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

Zasadniczo wewnętrzne szelki kręcone są ładne składnia inicjowanie KeyValuePair<string, object> obiektów.

+0

Czy pozycje w 'IDictionary ' typu 'KeyValuePair '? – Mahmoodvcs

+0

@Mahmoodvcs tak, 'IDictionary ' jest zasadniczo zbiorem 'KeyValuePair . – Oliver

4

I rozwiązać to stosując metodę rozszerzenia:

/// <summary> 
/// Use this extension method to create a dictionary or objects 
///  keyed by their property name from a given container object 
/// </summary> 
/// <param name="o">Anonymous name value pair object</param> 
/// <returns></returns> 
public static Dictionary<string, object> ToDictionary(this object o) 
{ 
    var dictionary = new Dictionary<string, object>(); 

    foreach (var propertyInfo in o.GetType().GetProperties()) 
    { 
     if (propertyInfo.GetIndexParameters().Length == 0) 
     { 
      dictionary.Add(propertyInfo.Name, propertyInfo.GetValue(o, null)); 
     } 
    } 

    return dictionary; 
} 

oraz rozszerzenia Html Helper:

/// <summary> 
/// When viewData is null, we just return null. Otherwise, we 
///  convert the viewData collection to a ViewDataDictionary 
/// </summary> 
/// <param name="htmlHelper">HtmlHelper provided by view</param> 
/// <param name="viewData">Anonymous view data object</param> 
/// <returns></returns> 
public static ViewDataDictionary vd(this HtmlHelper htmlHelper, object viewData) 
{ 
    if (viewData == null) return null; 

    IDictionary<string, object> 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; 
} 

Korzystając z pliku ostrzami:

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

Zupełnie przesada, ale to dobra informacja –