为什么在MVC4 Razor View中找不到扩展方法?

时间:2013-10-08 18:39:47

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

给出以下字符串扩展方法

namespace JHS.ExtensionMethods
{
  public static class StringExtensions
  {
    public static string ToUSAPhone(this String str)
    {
      return String.Format("{0:(###) ###-####}", Double.Parse(str));
    }
  }
}

在MVC4 Razor视图中添加了@using语句

@using JHS.ExtensionMethods;

以下字符串值调用扩展方法

@Model.producer.phone.ToUSAPhone()

会导致以下错误

'string' does not contain a definition for 'ToUSAPhone'

我还尝试将名称空间放在/ Views文件夹的web.config中,并收到相同的错误。

<pages pageBaseType="System.Web.Mvc.WebViewPage">
  <namespaces>
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Optimization"/>
    <add namespace="System.Web.Routing" />
    <add namespace="JHS.ExtensionMethods"/>
  </namespaces>
</pages>

我已经通过将相同的调用放在C#类

中验证了扩展方法的工作原理
string test=producer.phone.ToUSAPhone();

似乎MVC4 Razor视图中没有对扩展方法的引用,但我无法弄清楚为什么?

5 个答案:

答案 0 :(得分:35)

如果您尝试使用扩展方法的类型实际上是dynamic,则会发生这种情况。检查CSharp RuntimeBinder是否生成异常。如果是这样,您可以将该方法用作常用或园林静态方法:

@StringExtensions.ToUSAPhone(Model.producer.phone)

或者您可以将值强制转换为字符串:

@(((string)Model.producer.phone).ToUSAPhone())

According to Eric Lippert(以前是MSFT):

  

动态不支持扩展这一事实背后的原因   类型是因为在常规的,非动态的代码扩展方法中工作   通过对编译器已知的所有类进行全面搜索   具有匹配扩展方法的静态类。搜索进行   按顺序基于命名空间嵌套和可用的“使用”   每个命名空间中的指令。

     

这意味着为了获得动态扩展方法的调用   正确解决,不知何故,DLR必须在运行时知道所有内容   命名空间嵌套和“使用”指令都在您的源代码中   码。没有用于编码所有信息的机制   进入呼叫网站。

答案 1 :(得分:1)

不仅是您调用扩展方法的类型是动态的,而且表达式中的任何内容都是动态的而不是强制转换。

例如,这显然是动态的:

@ViewBag.ToJSON()

但我首先认为迈克的回答并不适用于我,因为我这样做:

@(ViewBag.UserProfile.GetJSONProfile().ToJSON())

其中ToJSON()是我的扩展方法,GetJSONProfile()只返回object

我只是间歇而且愚蠢但是想提一下。

答案 2 :(得分:0)

在为扩展程序添加自定义命名空间之前构建项目。

答案 3 :(得分:0)

可能还有另一个琐碎的原因,这发生在我身上。

我在其中创建扩展名的文件的VS文件属性窗格上的“构建操作”属性的值为“内容”。

自然将其切换为“编译”即可解决此问题……

答案 4 :(得分:0)

我遇到了完全相同的问题和相同的错误消息,但在我的情况下以某种奇怪的方式,我通过放置“;”来修复它

那是什么

@{var subti = item.subtitle.Truncate(18)}

用 ;

修复
@{var subti = item.subtitle.Truncate(18);}

这也许可以帮助某人

相关问题