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
是一个具有多个字符串属性的模型实例。谢谢,答案非常简单。显然,我必须尝试强类型模型:)谢谢,答案很简单。显然,我必须尝试强类型模型:)