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?
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
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. –