我正在进行一个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?类型时,我会得到一个无法将可空的decimal转换为对象的错误。我看了一下发现可以使用Expression.Convert来解决这个问题,但是当我这样做时,视图上会出现错误。
模板只能与字段访问、属性访问、单维数组索引或单参数自定义索引器表达式一起使用。
任何帮助都将不胜感激。这是我正在开发的一个概念证明项目,如果没有这个部分,它就无法继续进行了。
TextBoxFor()
会怎样呢?请尝试以下代码:@InputExtensions.TextBoxFor(Html, (dynamic)Model.GetParameterByName(prop))
,看看是否可行。 - Mike Strobel