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
参数为空。我错过了什么吗?这甚至有可能吗?
答
为什么不使用非“for”方法?例如,@Html.CheckBox()
。只需将属性名称传递给方法,并且模型绑定在回发后仍然可以工作
答
忘记强类型,XXXFor助手和lambda表达式。一旦你开始反射游戏,你必须把它玩到最后。
XXXFor助手使用非常简单的表达式,如属性访问。
m => new PropertyWrapper<String>(propertyInfo, Model).Property
远远超出了这些帮助者的能力。
我没意识到它们会被自动绑定!如果你给你的评论一个答案,我会接受。 – 2012-04-02 18:30:46
我把它移到了答案上。 – 2012-04-02 18:31:45