Asp.net mvc 扩展方法don';不处理通过ViewBag传递的模型实例的属性

Asp.net mvc 扩展方法don';不处理通过ViewBag传递的模型实例的属性,asp.net-mvc,extension-methods,viewbag,Asp.net Mvc,Extension Methods,Viewbag,我有以下字符串扩展方法: public static string Truncate(this string value, int maxLength = 75) { /* ... */ } 我想在视图中使用它,它可以正确地处理文本字符串。但是当我在ViewBag中有一个模型实例(我们称它为对象)并尝试截断它的一个字符串属性时,我会得到一个RuntimeBinderException: “字符串”不包含“截断”的定义 为什么会这样?我能修一下吗 谢谢。因为ViewBag是动态的类型,所

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

public static string Truncate(this string value, int maxLength = 75)
{
    /* ... */
}
我想在视图中使用它,它可以正确地处理文本字符串。但是当我在ViewBag中有一个模型实例(我们称它为
对象
)并尝试
截断它的一个字符串属性时,我会得到一个
RuntimeBinderException

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

为什么会这样?我能修一下吗


谢谢。

因为
ViewBag
动态的
类型,所以如果不先转换到适当的类型,扩展方法将不会根据其属性进行选择

例如:

@(((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>

由于
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>
我做一些像(清洁)

然后。。。
@areaName.ExtensionMethod()
我做了一些类似(clean)的事情

然后。。。
@areaName.ExtensionMethod()

您是否将viewBag对象强制转换为字符串?@四十二,不。实际上,我是这样做的:
@viewBag.object.stringProperty.Trunctate()
其中
对象
是一个具有多个字符串属性的模型实例。您是否将viewBag对象强制转换为字符串?@四十二,不。确切地说,我是这样做的:
@ViewBag.object.stringProperty.Trunctate()
其中
object
是一个具有多个字符串属性的模型实例。谢谢,答案非常简单。显然,我必须尝试强类型模型:)谢谢,答案很简单。显然,我必须尝试强类型模型:)