所以我有以下帮助器方法返回给定表达式的属性的名称。它在MVC应用程序中用于根据需要绑定的属性在视图中设置隐藏字段的ID。
public static string GetIDFromPropertyName<T>(Expression<Func<T>> exp)
{
return (((MemberExpression)(exp.Body)).Member).Name;
}
但我想要的是能够传递一个表达式,如:
GetIDFromPropertyName(() => model.AComplexProperty.AnotherComplexProperty.ASimpleProperty)
然后又回到我身边了:
AComplexProperty_AnotherComplexProperty_ASimpleProperty
我该怎么做?
更新:要明确,我需要在服务器端执行此操作,而不是在Razor中执行此操作。最终传递给我的局部视图的模型将不包含属性本身,只是一个字符串属性,其中包含用于隐藏字段的ID,因此无法使用内置的IdFor扩展
答案 0 :(得分:0)
从此"B_C_D"
获取GetIDFromPropertyName(() => a.B.C.D)
您可以使用此代码:
public static string GetIDFromPropertyName<T>(Expression<Func<T>> exp)
{
var members = new List<string>();
GetIDFromPropertyName(exp.Body, members);
// members contains {"D", "C", "B", "a"}
// now simply return the appropiate result, example:
members.RemoveAt(members.Count -1);
members.Reverse();
return members.Aggregate((s1, s2) => s1 + "_" + s2);
}
private static void GetIDFromPropertyName(Expression exp, List<string> members)
{
var expression = exp as MemberExpression;
if(expression != null)
{
var memberExpression = expression;
members.Add(memberExpression.Member.Name);
GetIDFromPropertyName(memberExpression.Expression, members);
}
}