2012-04-02 16 views
2

Ich versuche, ein Formular zur Laufzeit zu generieren. Ich habe mit diesem AnsatzASP.NET MVC 3 dynamische Formulargenerierung

@using (Html.BeginForm()) { 
    @foreach (var propertyInfo in typeof(MvcApplication1.Models.LogOnModel).GetProperties()) { 
     if (propertyInfo.PropertyType == typeof(Boolean)) { 
      Html.CheckBoxFor(m => new PropertyWrapper<Boolean>(propertyInfo, Model).Property); 
     } 
     else if (propertyInfo.PropertyType == typeof(String)) { 
      Html.TextBoxFor(m => new PropertyWrapper<String>(propertyInfo, Model).Property); 
     } 
     ... 
    } 
} 

Mit dieser Klasse der [ElementType]For() Methoden zu ermöglichen, am Ende zu arbeiten (sie müssen einen Verweis auf eine Eigenschaft, die nicht mithilfe von Reflektion abgerufen werden kann).

public class PropertyWrapper<T> { 
    private PropertyInfo _propertyInfo; 
    private Object _instance; 

    public PropertyWrapper(PropertyInfo propertyInfo, Object instance) { 
     _propertyInfo = propertyInfo; 
     _instance = instance; 
    } 

    public T Property { 
     get { return (T)_propertyInfo.GetValue(_instance, null); } 
     set { _propertyInfo.SetValue(_instance, value, null); } 
    } 
} 

bekomme ich folgende Fehler

System.Reflection.TargetException: Non-static method requires a target. 

weil instance Parameter von PropertyWrapper Konstruktor null ist. Fehle ich etwas? Ist das überhaupt möglich?

+0

Ich wusste nicht, dass sie automatisch gebunden werden würde! Wenn Sie Ihren Kommentar zu einer Antwort machen, akzeptiere ich. –

+0

Ich habe es zu einer Antwort bewegt. –

Antwort

1

Warum nicht die nicht "für" Methoden verwenden? @Html.CheckBox() zum Beispiel. Übergeben Sie einfach den Namen der Eigenschaft an die Methode, und Modellbindung funktioniert auch nach dem Postback

3

Vergiss das starke Tippen, die XXXFür Helfer und Lambda-Ausdrücke. Sobald Sie das Reflection-Spiel gestartet haben, müssen Sie es bis zum Ende spielen.

Die XXXFor-Helfer arbeiten mit sehr einfachen Ausdrücken, wie z.

m => new PropertyWrapper<String>(propertyInfo, Model).Property ist weit über die Fähigkeiten dieser Helfer hinaus.