ASP.NET MVC 3动态表单生成

问题描述:

我想在运行时生成一个表单。我已经结束了这种方法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

为什么不使用非“for”方法?例如,@Html.CheckBox()。只需将属性名称传递给方法,并且模型绑定在回发后仍然可以工作

忘记强类型,XXXFor助手和lambda表达式。一旦你开始反射游戏,你必须把它玩到最后。

XXXFor助手使用非常简单的表达式,如属性访问。

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