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)