假设
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。我现在正在使用表达式类,我可以将该属性提取为字符串,但其余部分我还没想到。
谢谢!
答案 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