ASp.NET MVC 3.0调用泛型扩展html辅助方法时出错

Jop*_*per 3 html-helper asp.net-mvc-3

我有一个像这样的扩展方法:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我在Razor View上调用这个方法(该方法的自动完成工作,它在视图中可见),但是我收到错误:

@Html.GetEnumValue<MyEnumHere>(1) //Getting error here
Run Code Online (Sandbox Code Playgroud)

错误: 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.
Run Code Online (Sandbox Code Playgroud)

如果说谎的话,在编译期间也不会出错

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

错误: No overload for method 'Write' takes 0 arguments

有什么建议?

更新0.1:

让它像那样工作:

var value = Html.GetEnumValue<MyEnum>(1);
    @value
Run Code Online (Sandbox Code Playgroud)

仍然质疑为什么在这种情况下它不起作用:

 @Html.GetEnumValue<MyEnumHere>(1)
Run Code Online (Sandbox Code Playgroud)

更新0.2

在我更新我的扩展方法后返回IHtmlStirng仍然没有得到它的工作:

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

@foreach (var thing in Model.Stuff)
{
    @Html.GetEnumValue<MyEnum>(thing.Id)
}
Run Code Online (Sandbox Code Playgroud)

执行期间出错:

'foreach块缺少一个结束的"}"字符.确保此块中的所有"{"字符都有匹配的"}"字符,并且没有任何"}"字符被解释为标记.

<MyEnum>由于某种原因解释为html标签(获得警告:警告1"MyEnum"元素未关闭.所有元素必须是自动关闭或具有匹配的结束标记.)并且我也无法导航到我的扩展方法在这种情况下,但如果我@从声明(Html.GetEnumValue<MyEnum>(thing.Id))中删除,我可以导航我的方法

Dar*_*rov 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());
}
Run Code Online (Sandbox Code Playgroud)

然后在你的视图中你将能够像这样调用它(请注意,如果你想使用泛型<并且>被Razor解析器视为特殊字符,你可能需要将它包装在括号中):

@(Html.GetEnumValue<MyEnumHere>(1))
Run Code Online (Sandbox Code Playgroud)