成员表达式无法从可空小数转换为对象
我正在研究MVC项目,并希望将Html.TextboxFor方法传递给属性的名称。 这是我的viewmodel
public class RuleViewModel where T : class, IValidatableObject { private T _rule; public T RuleModel { get { return _rule ?? (_rule = Activator.CreateInstance()); } } public RuleMetadata Metadata { get; set; } public Expression<Func<RuleViewModel, Object>> GetParameterByName(PropertyInfo pi) { var fieldName = Expression.Parameter(typeof(RuleViewModel), "x"); var fieldExpression = Expression.PropertyOrField(Expression.Property(fieldName, "RuleModel"), pi.Name); var exp = Expression.Lambda<Func<RuleViewModel, 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) { @Html.TextBoxFor(Model.GetParameterByName(prop)) } }
问题是,当属性是十进制类型?时,我得到一个无法将可空小数转换为对象错误。 我环顾四周,发现你可以使用Expression.Convert来解决这个问题,但是当我这样做时,我在视图上出现错误
模板只能用于字段访问,属性访问,单维数组索引或单参数自定义索引器表达式。
任何帮助,将不胜感激。 这是我正在研究的概念certificate项目,如果没有这件作品,它就已经死了。
问题是,在调用TextBoxFor
时,不能只将object
用作TProperty
。 它期望forms为Func
的lambda表达式,以及C#的方差规则使得Func
不与Func
分配兼容。 您也不能简单地使用Convert()
,因为MVC内部将不接受其主体是Convert
表达式的lambda。
你可以做的是使用动态绑定来使用正确的类型参数调用TextBoxFor
:
public Expression GetParameterByName(PropertyInfo pi) { var fieldName = Expression.Parameter(typeof(RuleViewModel), "x"); var fieldExpression = Expression.PropertyOrField( Expression.Property(fieldName, "RuleModel"), pi.Name); var exp = Expression.Lambda( typeof(Func<,>).MakeGenericType(typeof(RuleViewModel ), fieldExpression.Type), fieldExpression, fieldName); return exp; } // ... @InputExtensions.TextBoxFor(Html, (dynamic)Model.GetParameterByName(prop))