使用WebGrids时,我发现我可以访问绑定到WebGrid的模型上的属性,但是我无法访问模型本身的方法。
例如,这有效:
// Accessing a property of item works
reportGrid.Column("", header: "First Name", format: item => item.firstName )
但这不起作用: (我正在展示一个简单的例子,但对于我的情况,我必须在User对象本身上调用一个方法。)
// Accessing a method on item does not work
reportGrid.Column("", header: "First Name Backwards", format: item => item.firstNameBackwards() )
=> error: 'System.Web.Helpers.WebGridRow' does not contain a definition for 'getFullName'
这似乎与以下内容有关:
Why can't I use my extension method in a delegate in the Razor WebGrid http://www.mikesdotnetting.com/Article/171/Why-You-Can%27t-Use-Extension-Methods-With-A-WebGrid
我没有看到将这些解决方案应用于我的问题的方法。正如Mike Brind所说:
WebGridColumn的Format参数所采用的参数是 代表:Func。这意味着你必须这样做 传递动态类型,然后在它之前完成某些操作 作为对象返回。
...
当您尝试使用扩展方法时,编译器将检查 您试图使用它来查看是否存在这样的方法。如果它 没有按'吨。它将检查该类型派生自的任何基类 看看它们是否包含正确名称的正式方法。
似乎应该找到我的方法,但也许不是因为绑定到WebGrid的模型实际上是一个包含IList<T> LineItems
的分页模型,它保存了我的User引用。
有没有办法转换或获取User对象本身的引用,所以除了访问其属性外,我还可以调用其上定义的方法?
答案 0 :(得分:1)
我找到了解决这个问题的方法,但我仍然希望有更好的方法。我将不胜感激任何有关此或替代解决方案的反馈。
在探索这个问题并检查我的一些其他WebGrid代码时,我发现我能够访问针对可以通过绑定到WebGrid的模型对象上的属性访问的对象定义的二阶方法。
示例(简化):
reportGrid.Column("", header: "First Name Backwards",
format: item => item.BestFriend.firstNameBackwards() )
=> Works!
更进一步,我将双向关系追溯到原始对象,以便我可以调用它的方法:
// Assume all best-friend relationships are reciprocal
reportGrid.Column("", header: "First Name Backwards",
format: item => item.BestFriend.BestFriend.firstNameBackwards() )
=> Works!
考虑到这一点,我修改了我的用户模型以包含对自身的引用:
public User() {
this._self = this; // Initialize User object with a reference to itself
}
[NotMapped]
public User _self { get; set; }
解决方案 - 现在我可以使用_self属性调用针对User模型定义的方法。
reportGrid.Column("", header: "",
format: item => Helper.userTML(item._self.firstNameBackwards() ) )
=> Works!
答案 1 :(得分:0)
在探讨这个问题并检查我的一些其他WebGrid代码时,我发现我能够访问针对可以通过绑定到WebGrid的模型对象上的属性访问的对象定义的二阶方法。
我有同样的问题,根据这个评论,我发现这是因为我没有公开模型的数据成员。将firstName定义设置为public,这将解决它。
答案 2 :(得分:0)
我发现对我有用的最好方法是在模型类中使用getter。
在您的模型类(用户?)中:
public string firstNameBackwards
{
get
{
var firstNameBackwards = firstName;
// Do something here
return firstNameBackwards;
}
}
在您的网络广告中:
reportGrid.Column("", header: "First Name Backwards", format: item => item.firstNameBackwards )