2012-04-02 215 views
2

我想在運行時生成一個表單。我已經結束了這種方法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); 
     } 
     ... 
    } 
} 

有了這個類,允許[ElementType]For()方法的工作(他們需要不能使用反射來檢索的屬性的引用)。

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

我收到以下錯誤

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

因爲PropertyWrapper構造instance參數爲空。我錯過了什麼嗎?這甚至有可能嗎?

+0

我沒意識到它們會被自動綁定!如果你給你的評論一個答案,我會接受。 – 2012-04-02 18:30:46

+0

我把它移到了答案上。 – 2012-04-02 18:31:45

回答

1

爲什麼不使用非「for」方法?例如,@Html.CheckBox()。只需將屬性名稱傳遞給方法,並且模型綁定在回發後仍然可以工作

3

忘記強類型,XXXFor助手和lambda表達式。一旦你開始反射遊戲,你必須把它玩到最後。

XXXFor助手使用非常簡單的表達式,如屬性訪問。

m => new PropertyWrapper<String>(propertyInfo, Model).Property遠遠超出了這些幫助者的能力。