MVC帮助程序联机工作,但不在App_Code中工作

本文关键字:工作 App Code 帮助程序 联机 MVC | 更新日期: 2023-09-27 17:58:14

最初我为每个菜单项重复了几行代码,只是对各种菜单项值进行了硬编码,但后来我遇到了助手,并教我要试一试。现在,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显示为文本字符串,而不是编译到一个正确的路径,该路径应始终指向应用程序的主文件夹。

以下是我用来参考的链接:

http://weblogs.asp.net/jgalloway/archive/2011/03/23/comparing-mvc-3-helpers-using-extension-methods-and-declarative-razor-helper.aspx

具体来说,不到页面下方"Razor Declarative Helpers"标题下的1/4。从现在开始。

提前感谢您的帮助。

MVC帮助程序联机工作,但不在App_Code中工作

Razor内联@helper中不提供标准帮助程序(如UrlHelper和HtmlHelper)。如果您需要使用它,则需要将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")