ExpressionHelper.GetExpressionText(表达式)不返回我的属性的名称

PlT*_*lor 6 lambda asp.net-mvc-3

我已经实现了一个MVC扩展来格式化我的应用程序中的数字.它基于此处的代码.如下

public static MvcHtmlString DecimalBoxFor<TModel>(this HtmlHelper<TModel> html, Expression<Func<TModel, double?>> expression, string format, object htmlAttributes = null)
{
    var name = ExpressionHelper.GetExpressionText(expression);   
    double? dec = expression.Compile().Invoke(html.ViewData.Model);
    var value = dec.HasValue ? (!string.IsNullOrEmpty(format) ? dec.Value.ToString(format) : dec.Value.ToString()): "";
    return html.TextBox(name, value, htmlAttributes);
}
Run Code Online (Sandbox Code Playgroud)

当我使用以下Razor语法行调用它时

@Html.DecimalBoxFor(model => Model.PointAttributes[i].Data.Y,"0.000", new { @class = "span1 number" })
Run Code Online (Sandbox Code Playgroud)

我得到一个例外,因为我的扩展名中的变量'name'是一个空字符串.我已经尝试将var name行更改为this但它只给了我'Y'的属性名称,而不是我需要将模型绑定回MVC的完整'Model.PointAttributes [i] .Data.Y'.

var name = ((expression.Body is MemberExpression ?((MemberExpression)expression.Body).Member : ((MemberExpression)((UnaryExpression)expression.Body).Operand).Member)).Name;
Run Code Online (Sandbox Code Playgroud)

Nad*_*av 8

尝试使用此功能:

    static public string GetExpressionText(LambdaExpression p)
    {
        if (p.Body.NodeType == ExpressionType.Convert || p.Body.NodeType == ExpressionType.ConvertChecked)
        {
            p = Expression.Lambda(((UnaryExpression)p.Body).Operand,
                p.Parameters);
        }
        return ExpressionHelper.GetExpressionText(p);
    }
Run Code Online (Sandbox Code Playgroud)


Rub*_*zzo 6

这是一种已知的行为.我已经想出了编写我自己的ExpressionHelper那个句柄的特定情况.现在你有两个选择:

  1. 使用NuGet包:

    Install-Package Mariuzzo.Web.Mvc.Extras
    
    Run Code Online (Sandbox Code Playgroud)
  2. 或者只需获取前面提到的ExpressionHelper的源代码并将其粘贴到您的项目中.