MVC WebGrid - 如何在WebGridRow项/模型上调用方法?

时间:2014-04-04 19:40:05

标签: c# asp.net-mvc asp.net-mvc-4 webgrid

使用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对象本身的引用,所以除了访问其属性外,我还可以调用其上定义的方法?

3 个答案:

答案 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 )