我正在开发一个 MVC 项目,并希望向 Html.TextboxFor 方法传递属性名称。这是我的视图模型
public class RuleViewModel<T> where T : class, IValidatableObject
{
private T _rule;
public T RuleModel
{
get
{
return _rule
?? (_rule = Activator.CreateInstance<T>());
}
}
public RuleMetadata Metadata { get; set; }
public Expression<Func<RuleViewModel<T>, Object>> GetParameterByName(PropertyInfo pi)
{
var fieldName = Expression.Parameter(typeof(RuleViewModel<T>), "x");
var fieldExpression = Expression.PropertyOrField(Expression.Property(fieldName, "RuleModel"), pi.Name);
var exp = Expression.Lambda<Func<RuleViewModel<T>, Object>>(fieldExpression, fieldName);
return exp;
}
}
然后在视图中我这样做
@foreach (var prop in Model.RuleModel.GetType().GetProperties())
{
var result = Model.Metadata.Columns.SingleOrDefault(m => m.ColumnName == prop.Name);
if (result != null)
{
<td>
@Html.TextBoxFor(Model.GetParameterByName(prop))
</td>
}
}
问题是,当属性的类型为decimal?时,我收到无法将可为空的十进制转换为对象错误。我环顾四周,发现您可以使用 Expression.Convert 来解决此问题,但是当我这样做时,视图上出现错误
模板只能与字段访问、属性访问、一维数组索引或单参数自定义索引器表达式一起使用。
任何帮助,将不胜感激。这是我正在开展的一个概念验证项目,如果没有这件作品,它就会死在水中。
问题是你不能只使用object
as TProperty
打电话时TextBoxFor<TModel, TProperty>()
。它需要以下形式的 lambda 表达式Func<TModel, TProperty>
,C# 的方差规则是这样的Func<TModel, decimal?>
赋值不兼容Func<TModel, object>
。你也不能简单地使用Convert()
,因为 MVC 内部不会接受主体是 a 的 lambdaConvert
表达。
你什么can要做的是使用动态绑定来调用TextBoxFor<TModel, TProperty>()
使用正确的类型参数:
public Expression GetParameterByName(PropertyInfo pi)
{
var fieldName = Expression.Parameter(typeof(RuleViewModel<T>), "x");
var fieldExpression = Expression.PropertyOrField(
Expression.Property(fieldName, "RuleModel"),
pi.Name);
var exp = Expression.Lambda(
typeof(Func<,>).MakeGenericType(typeof(RuleViewModel<T>), fieldExpression.Type),
fieldExpression,
fieldName);
return exp;
}
// ...
@InputExtensions.TextBoxFor(Html, (dynamic)Model.GetParameterByName(prop))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)