2009-05-08 8 views
0

Ich schreibe ein TwoWay-Bindungssteuerelement für ASP.NET. Ich habe endlich die Arbeit aufgenommen. Ich bin neu zu binden mit dem folgenden Code:Wie verwende ich Reflektion, um die geschachtelte Eigenschaft zu erhalten

private void RebindData() 
{ 
    // return if the DataValue wasn't loaded from ViewState 
    if (DataValue == null) 
     return; 
    // extract the values from the two-way binding template 
    IOrderedDictionary values = new OrderedDictionary(); 
    IBindableTemplate itemTemplate = DataTemplate as IBindableTemplate; 
    if (itemTemplate != null) 
    { 
     foreach (DictionaryEntry entry in itemTemplate.ExtractValues(this)) 
     { 
      values[entry.Key] = entry.Value; 
     } 
    } 

    // use reflection to push the bound fields back to the datavalue 
    foreach(var key in values.Keys) 
    { 
     var type = typeof(T); 
     var pi = type.GetProperty(key.ToString()); 
     if (pi != null) 
     { 
      pi.SetValue(DataValue, values[key], null); 
     } 
    } 
} 

Dies ist für die einfache Fälle wie dies funktioniert:

<%# Bind("Name") %> 

Die Reflexionstechnik Ich verwende nicht funktioniert, wenn ich eine verschachtelte verbindliche Aussage haben wie folgt:

<%# Bind("Customer.Name") %> 

Gibt es eine einfache Möglichkeit, Reflektion für verschachtelte Eigenschaften wie diese zu verwenden? Soll ich dafür eine rekursive Funktion oder nur eine Schleife verwenden?

Antwort

1

Warum nicht ASP.NET DataBinder verwenden, der dies bereits unterstützt?

+0

Ich habe viele verschiedene Ansätze zur Verwendung der integrierten ASP.NET Zwei-Wege-Bindung untersucht, mein Ansatz ist sehr ähnlich zu der FormView, aber ich möchte die DataSource ein einzelnes Element, kein IEnumerable sein. – bendewey

+1

Sorry ... war nicht klar. Ich habe darüber nachgedacht, die integrierte Methode DataBinder.Eval zu verwenden, die bereits die Namenskonvention für Untereigenschaften unterstützt. Um jedoch das IEnumerable-Problem zu beheben, müssen Sie nicht direkt an eine Auflistung binden. Sie können ein Objekt direkt binden und anschließend per Name an die Eigenschaften des Objekts binden. –

Verwandte Themen