我有一个像这样的扩展方法:
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 View上调用此方法(该方法的自动完成工作,它在视图中可见),但是我收到错误:
@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”元素未关闭。所有元素必须是自动关闭或具有匹配的结束标记。< / strong>)在这种情况下我也无法导航到我的扩展方法,但是如果我从声明(@
)中移除Html.GetEnumValue<MyEnum>(thing.Id)
而不是我可以导航我的方法
答案 0 :(得分: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());
}
然后在您的视图中,您将能够像这样调用它(请注意,如果您想将泛型用作<
并且>
被视为特殊处理,则可能需要将其包装在括号中Razor解析器的字符):
@(Html.GetEnumValue<MyEnumHere>(1))