我正在尝试在运行时生成一个表单。我最终采用了这种方法
@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
参数为 null。我错过了什么吗?这可能吗?
最佳答案
忘掉强类型、XXXFor 助手和 lambda 表达式吧。一旦开始反射游戏,您就必须玩到底。p>
XXXFor 帮助程序使用非常简单的表达式,例如属性访问。
m => new PropertyWrapper<String>(propertyInfo, Model).Property
远远超出了那些 helper 的能力范围。
关于c# - ASP.NET MVC 3 动态表单生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9981724/