2013-03-21 40 views
0

通过模型实例的属性工作,我有以下字符串扩展方法:扩展方法不要通过ViewBag

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

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

“串”不包含定义“截断”

为什么会发生?我能解决这个问题吗?

谢谢。

+0

你有没有投的viewBag对象为字符串? – 2013-03-21 16:23:58

+0

@四十二,没有。从字面上看,我是这样做的:'@ ViewBag.object.stringProperty.Trunctate()'其中'object'是一个模型实例,它有几个字符串属性。 – nameless 2013-03-21 16:27:32

回答

4

因为ViewBagdynamic类型,所以扩展方法不会在其属性上被拾取而不会先转换为适当的类型。

例如:

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

个人而言,我限制我的ViewBag使用,以避免投无处不在(除其他原因)。相反,我为每个视图使用强类型的视图模型。


为了完整起见,也可以,如果包含扩展命名空间是不是在你的视图中引用遇到此错误。

您可以在您的意见坐在web.config中添加的命名空间的文件夹:

enter image description here

添加命名空间下节:

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

或者,你可以在剃须刀视图本身中导入名称空间:

@using MyProject.Extensions 
+0

谢谢,答案结果非常简单。显然我必须尝试强类型的模型:) – nameless 2013-03-21 16:40:35

0

我这样做(清洁)

@{ 
    string areaName = ViewBag.AreaName; 
} 

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