2012-04-02 14 views
2

実行時にフォームを生成しようとしています。私は(彼らはリフレクションを使用して取得することができないプロパティへの参照が必要)[ElementType]For()メソッドが機能するように、このクラスでは、このアプローチASP.NET MVC 3動的フォーム生成

@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); 
     } 
     ... 
    } 
} 

になってしまっています。

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

PropertyWrapperコンストラクタのinstanceパラメータがnullであるので、私は次のエラー

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

を取得します。何か不足していますか?これも可能ですか?

+0

私は自動的にバインドされることを認識しませんでした。あなたがあなたのコメントを答えたら、私は受け入れます。 –

+0

私はそれを答えに移しました。 –

答えて

1

「for」以外の方法を使用してみませんか?例えば、@Html.CheckBox()である。プロパティの名前をメソッドに渡すだけで、モデルのバインディングはポストバック後も機能します。

3

強い入力については、XXXForヘルパーとラムダ式は忘れてください。反射ゲームを開始すると、最後まで再生する必要があります。

XXXForヘルパーは、プロパティアクセスなどの非常に簡単な表現で動作します。

m => new PropertyWrapper<String>(propertyInfo, Model).Propertyは、これらのヘルパーの機能をはるかに超えています。

関連する問題