如何将指定属性的lambda表达式转换为与asp.net mvc兼容的名称'字符串代表相同?

时间:2015-01-01 23:03:28

标签: c# asp.net asp.net-mvc linq

假设

string value = ViewModelObject.SomeList[n].AnotherList[m].SomeProperty.ToString() //value is '5'

我需要转过身来:

Expression<Func<ViewModelObjectType, object>> exp = x => x.SomeList[n].AnotherList[m].SomeProperty 

<input type='hidden' name='SomeList[n].AnotherList[m].SomeProperty' value='5'/>

其中n和m是整数。

我打赌有人会在此之前解决这个问题。我想以类型安全的方式将我的javascript控件绑定到我的页面viewmodel。我现在正在使用表达式类,我可以将该属性提取为字符串,但其余部分我还没想到。

谢谢!

2 个答案:

答案 0 :(得分:4)

@Html.HiddenFor助手似乎可以满足您的需求:

@Html.HiddenFor(x => x.SomeList[n].AnotherList[m].SomeProperty)

但是如果由于某种原因你不能依赖已经构建到框架中的内容,那么你总是可以使用ExpressionHelper.GetExpressionText方法来推送自己的东西,这是ASP.NET MVC内置助手已经在使用的方法:< / p>

public static class HtmlExtensions
{
    public static string Foo<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> ex)
    {
        return ExpressionHelper.GetExpressionText(ex);
    }
}

然后在强类型视图中使用它:

<input type='hidden' name='@Html.Foo(x => x.SomeList[n].AnotherList[m].SomeProperty)' value='5'/>

答案 1 :(得分:1)

我不得不使用这种礼貌:ExpressionHelper.GetExpressionText(expression) not returning the name of my property

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);
}

我的NodeType始终评估为ExpressionType.Convert