2013-09-04 3 views
20

je cherchais un moyen de passer ViewDataDictionary à une vue partielle dans ASP.NET MVC que je suis venu à cette syntaxe:syntaxe Initializer: new ViewDataDictionary {{ "Nom", "Value"}}

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

Je suis un peu confus au sujet de la syntaxe d'initialisation ici. quelqu'un peut-il me l'expliquer?

+0

MSDN sur initializers de collecte dans [C#] (https://msdn.microsoft.com/en-us/library/bb384062.aspx) et [VB] (https://msdn.microsoft.com/fr-fr/library/dd293617.aspx) – KyleMit

Répondre

40

ViewDataDictionary implémente IDictionary<string, object>.

IDictionary<string, object> est essentiellement une collection de KeyValuePair<string, object>.

Votre initialiseur ViewDataDictionary contient un autre jeu d'accolades qui représente un initialiseur KeyValuePair<string, object>.

La raison pour laquelle cela est possible est expliquée dans this answer.

Vous pouvez ajouter plusieurs éléments par des virgules séparant les KeyValuePair<string, object> initializers:

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

Identique:

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

Essentiellement, les accolades internes sont la syntaxe agréable pour initialiser KeyValuePair<string, object> objets.

+0

Les éléments dans 'IDictionary ' de type 'KeyValuePair '? – Mahmoodvcs

+0

@Mahmoodvcs oui, 'IDictionary ' est essentiellement une collection de 'KeyValuePair '. – Oliver

4

I résolu cela en utilisant une méthode d'extension:

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

et une extension Helper HTML:

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

Utilisation d'un fichier de rasoir:

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

Totalement exagéré, mais c'est une bonne info –

Questions connexes