5

我正在使用 MVC 3 引入的 WebGrid,但是在传递参数的委托时不能应用我自己的扩展方法format

使用:

Grid.Column("MyProperty", "MyProperty", 
format: @<span class="something">@item.MyProperty.MyExtensionMethodForString()</span>)

我有

ERROR: 'string' does not contain a definition for 'MyExtensionMethodForString'

我试过铸造,没有用

Grid.Column("MyProperty", "MyProperty", 
format: @<span class="something">@((string)(item.MyProperty).MyExtensionMethodForString())</span>)

如果我使用标准方法,它可以工作:

Grid.Column("MyProperty", "MyProperty", 
format: @<span class="something">@(Utils.MyExtensionMethodForString(item.MyProperty))</span>)

我还尝试将扩展名放在同一个命名空间中,但没有结果。

如何使用我心爱的扩展程序?

编辑:命名空间本身不是问题,扩展可用于所有视图和类的命名空间,我可以在同一个视图中毫无问题地使用它。问题是在委托中使用它时。

4

3 回答 3

2

这不是 WebGrid 或 Razor 的限制。这是 C#dynamic类型的限制。您不能在动态上使用扩展方法。格式助手将 aFunc<dynamic, object>作为参数,因此item参数是动态类型。

几年前我写过这个确切的问题。

于 2013-03-26T06:38:15.207 回答
1

这对我来说很好。静态类:

public static class TestExtensions
{
    public static string Foo(this HtmlHelper html, Func<object, HelperResult> func)
    {
        return func(null).ToHtmlString();
    }

    public static string MyStringExtension(this string s)
    {
        return s.ToUpper();
    }
}

索引.cshtml:

@using MvcApplication1.Controllers

@Html.Foo(@<text>@Html.Raw("Hello")</text>)

页面打印出来:

你好

但是,这个版本的 Index.cshtml:

@using MvcApplication1.Controllers

@Html.Foo(@<text>@("Hello".MyStringExtension())</text>)

打印出您的错误消息:

CS1061:“字符串”不包含“MyStringExtension”的定义,并且找不到接受“字符串”类型的第一个参数的扩展方法“MyStringExtension”(您是否缺少 using 指令或程序集引用?)

所以我怀疑 Jon 是正确的,这是 Razor 的一个限制。(为什么它与 HtmlHelper 一起工作让我有点困惑)

于 2013-03-22T22:06:39.993 回答
0

通过研究以下行抛出相同错误的原因找到了这个 SO 问题:

@a.GetAttribute<ActionLabelAttribute>().ActionLabel

事实证明,通过将这一行括在括号中可以很容易地纠正它,如下所示:

@(a.GetAttribute<ActionLabelAttribute>().ActionLabel)

注意:GetAttribute扩展方法来自这里

于 2016-01-26T18:54:12.610 回答