2011-05-17 77 views
3

時,我有一個擴展方式類似:ASp.NET MVC 3.0錯誤調用通用擴展HTML輔助方法

namespace System.Web.Mvc.Html 
{ 
    public static class HtmlExtensions 
    { 
     public static T GetEnumValue<T>(this HtmlHelper helper, int value) where T : struct, IConvertible 
     { 
      return EnumHelper<T>.GetEnumValue(value); 
     } 
    } 
} 

然後我呼籲Razor視圖這種方法(自動完成該法的工作,它是在視圖)可見,但比我得到的錯誤:

@Html.GetEnumValue<MyEnumHere>(1) //Getting error here 

錯誤:Cannot convert method group 'GetEnumValue' to non-delegate type 'object'. Did you intend to invoke the method?

,如果我去這樣的 - 在編譯時沒有錯誤:

Html.GetEnumValue<MyEnumHere>(1) //but in that case didnt get data to display. 

在編譯時也沒有得到錯誤,如果去謊言

@{ 
    Html.GetEnumValue<MyEnum>(1); //But then I am getting error during execution 
} 

錯誤:No overload for method 'Write' takes 0 arguments

有什麼建議?

更新0.1

得到它這樣的工作:

var value = Html.GetEnumValue<MyEnum>(1); 
    @value 

仍然質疑爲什麼在這種情況下,它不工作:

@Html.GetEnumValue<MyEnumHere>(1) 

更新0.2

我更新了我的擴展方法返回IHtmlStirng仍然沒有得到它後工作:

@using MyTypes.Enumerators 
@inherits MvcContrib.FluentHtml.ModelWebViewPage<MyModel> 

@foreach (var thing in Model.Stuff) 
{ 
    @Html.GetEnumValue<MyEnum>(thing.Id) 
} 

錯誤執行期間:

「在foreach塊缺少結束‘}’字符。確保你在這個塊中的所有「{」字符都有一個匹配的「}」字符,並且沒有任何「}」字符被解釋爲標記。

<MyEnum>由於某種原因解釋爲HTML標籤(得到警告:警告1「MyEnum」元素未關閉的所有元件必須是自封閉的或具有匹配的結束標記。),並且還我可以「T導航到在這種情況下我的擴展方法,但如果我從申報(Html.GetEnumValue<MyEnum>(thing.Id))刪除@比我可以瀏覽我的方法

+0

可能你的代碼發佈到您的EnumHelper .GetEnumValue(值); ? – 2011-05-18 10:51:51

回答

10

通常HTML傭工應該返回字符串或IHtmlString,因爲這是他們使用什麼(生成簡短的HTML您在視圖中重複使用的片段)。

所以也許你想這樣的:

public static IHtmlString GetEnumValue<T>(this HtmlHelper helper, int value) where T : struct, IConvertible 
{ 
    return MvcHtmlString.Create(EnumHelper<T>.GetEnumValue(value).ToString()); 
} 

,然後在你的看法,你將能夠調用它像這樣(注意,如果你想使用仿製藥<你可能需要把它包在括號和>由剃刀解析器當作特殊字符):

@(Html.GetEnumValue<MyEnumHere>(1)) 
+0

不能得到它的工作,仍然是同樣的事情 – Joper 2011-05-18 08:35:05

+0

@Joper,這很奇怪,因爲它適用於我。返回IHtmlString的html助手可以使用@ Html.XXX安全地調用 – 2011-05-18 09:04:26

+0

@Darin Dimitrov是的,這很奇怪,我已經更新了這個問題 – Joper 2011-05-18 10:41:00