最初我为每个菜单项重复了一行代码,只是对各种菜单项值进行了硬编码,但后来我找到了助手并教导我会尝试一下。现在6行代码(每个菜单项)减少到一个(对于每个项目),我有一个地方可以改变任何东西,而不是在5个地方改变它。所有伟大的东西。这是代码:
@helper MenuItem(string action, string controller)
{
<a href="@Url.Action(action, controller)" id="@controller">
<div class="MenuItem">
<img src="@("/XXX.YYY.Web/Content/Images/Icons/Menu/mnu"+controller+".png")" /><br />
//I had to put the XXX.YYY as a literal string because the ~ didn't work, it was quoted literally also instead of showing the home folder.
@controller
</div>
</a>
}
我的问题是,当我使用内联时,它可以工作,比如我的_Layout.cshtml顶部,并带有以下代码行:
@MenuItem("Index", "Home")
@MenuItem("Index", "Chart")
但是当我将它删除到App_Code文件夹下名为LayoutHelpers.cshtml的通用助手时,我可以重复使用它,并按如下方式更改代码:
@LayoutHelpers.MenuItem("Index", "Home")
@LayoutHelpers.MenuItem("Index", "Chart")
注意:实际助手中没有任何内容发生变化。只有_Layout.cshtml文件中的上述2行发生了变化。
当我进行这些更改时,我收到以下错误:
编译错误 描述:编译服务此请求所需的资源时发生错误。请查看以下特定错误详细信息并相应地修改源代码。
编译器错误消息:CS0103:当前上下文中不存在名称“Url”
来源错误:
第3行:@helper MenuItem(字符串操作,字符串控制器)
第4行:{
第5行:
第6行:
第7行:@
@
现在奇怪的是,注意它在第7行“mnuHome.png”上的工作方式,而不是mnucontroller.png。然而它说第5行是错误的。
我也有问题〜不在帮助器中工作。即。 〜/ Content显示为文字字符串,而不是编译为正确的路径,该路径应始终指向应用程序的主文件夹。
以下是我用作参考的链接:
特别是在“Razor Declarative Helpers”标题下的页面下方不到1/4。从这里开始。
提前感谢您的帮助。
答案 0 :(得分:3)
标准助手(例如UrlHelper和HtmlHelper)在Razor内联@helper
中不可用。如果您需要使用它,则需要将UrlHelper作为参数传递给您的助手:
@helper MenuItem(UrlHelper url, string action, string controller)
{
<a href="@url.Action(action, controller)" id="@controller">
<div class="MenuItem">
<img src="@url.Content("~/XXX.YYY.Web/Content/Images/Icons/Menu/mnu"+controller+".png")" />
<br />
@controller
</div>
</a>
}
然后在调用时传递正确的实例:
@LayoutHelpers.MenuItem(Url, "Index", "Home")
@LayoutHelpers.MenuItem(Url, "Index", "Chart")