0

我有以下字符串扩展方法:

public static string Truncate(this string value, int maxLength = 75)
{
    /* ... */
}

我想在视图中使用它,它可以与文字字符串一起正常工作。但是当我在 ViewBag 中有一个模型实例(我们称之为object)并尝试使用Truncate它的一个字符串属性时,我得到一个RuntimeBinderException

“字符串”不包含“截断”的定义

为什么会这样?我可以解决这个问题吗?

谢谢。

4

2 回答 2

4

因为ViewBag是一个dynamic类型,扩展方法不会在没有先转换为适当的类型的情况下在它们的属性上被拾取。

例如:

@(((string)ViewBag.stringProperty).Trunctate())

就我个人而言,我限制了我的使用,ViewBag以避免不得不到处施放(除其他原因外)。相反,我为每个视图使用强类型视图模型。


为了完整起见,如果您的视图中未引用包含您的扩展的命名空间,也可能会遇到此错误。

您可以在位于您的视图文件夹中的 web.config 中添加命名空间:

在此处输入图像描述

将命名空间添加到以下部分:

  <system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <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="MyProject.Extensions" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

或者,您可以在 razor 视图本身中导入命名空间:

@using MyProject.Extensions
于 2013-03-21T16:32:12.753 回答
0

我做类似(干净)的事情

@{
    string areaName = ViewBag.AreaName;
}

然后... <h4>@areaName.ExtensionMethod()</h4>

于 2015-05-23T17:07:58.580 回答