【发布时间】:2013-03-13 18:33:47
【问题描述】:
场景
public class Element {
public int Id {get;set;}
}
public class ViewModel {
public IList<Element> Elements{get;set;}
}
我有一个带有Expression<Func<Element, int>>类型参数的方法,
看起来像m => m.Id
我想变身
m => m.Id(其中 m 是一个元素)
到
x => x.Elements[0].Id 其中 x 是 ViewModel,0 是“索引”参数
我现在拥有的(当然是通用的,为了清楚起见我删除了通用部分)
public static class Helpers {
public static Expression<Func<ViewModel, int>> BuildExpressionArrayFromExpression(
this Expression<Func<Element, int>> expression,
ViewModel model,
int index = 0,
string bindingPropertyName = "Elements"//the name of the "List" property in ViewModel class
)
{
var parameter = Expression.Parameter(typeof(ViewModel), "x");
var viewModelProperty = model.GetType().GetProperty(bindingPropertyName);
Expression member = parameter;//x => x
member = Expression.Property(member, viewModelProperty);//x => x.Elements
var test1 = Expression.Property(member, "Item", new Expression[]{Expression.Constant(index)});
//x => x.Elements.Item[0], and I don't want Item
var test2 = Expression.Call(member, viewModelProperty.PropertyType.GetMethod("get_Item"), new Expression[] {Expression.Constant(index)});
//x 0> x.Elements.get_Item(0), and I don't want get_Item(0)
//code to add Id property to expression, not problematic
return Expression.Lambda<Func<ViewModel, int>(member, parameter);
}
}
编辑
我需要x => x.Elements[0] 而不是x => x.Elements.Item[0],因为
必须使用 InputExtensions.TextBoxFor(<myIndexedExpression>)
想象一下这样的课程
public class Test {
public int Id {get;set;}
public IList<Element> Elements {get;set;}
}
还有一个帖子操作
[HttpPost]
public ActionResult Edit(Test model) {
bla bla bla.
}
如果我的输入的名称属性没有很好地生成,我就会遇到绑定问题(model.Elements 在我的 Post Action 中是空的)。
我输入的名称属性应该是
Elements[0]PropertyName
我得到(取决于我的尝试)
PropertyName
或者(可能不准确,我试着重现这个案例)
Elements.Item[0].PropertyName
EDIT2
还尝试了不同的解决方案,使用 ViewData.TemplateInfo.HtmlFieldPrefix, 但我得到了
Elements.[0].PropertyName
(和 Elements_0_PropertyName 作为 Id)。
名称中的第一个点是不需要的,id中的第一个“双下划线”应该是一个简单的。
我实际上使用这个解决方案,使用 regex (argh) 来删除不需要的。和 _ ,但我想避免这种情况。
【问题讨论】:
-
您在哪里使用
Expression<Func<Element, int>> expression来调用分机? -
@HamletHakobyan 有点长解释,但它是一个可编辑的网格助手。如果“list”元素是模型,没问题。如果它是 ViewModel 的一部分(我现在面临的),并且我想将包含网格元素的模型绑定到我的 post 操作中,我需要解决这个问题...
-
你不懂我。您对
Expression<Func<Element, int>>类型进行了扩展,但您没有在扩展中使用扩展对象。 -
@HamletHakobyan 哦...好吧,我在我的扩展程序末尾使用它(未显示且没有问题的代码)(
m => m.a.b.Id应该变为x => x.list[0].a.b.Id:我从 @ 获取a.b.Id987654341@
标签: c# asp.net-mvc lambda expression-trees