2013-03-21 76 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>