1

最初我为每个菜单项重复了几行代码,只是对各种菜单项值进行了硬编码,但后来我遇到了帮助者,并告诉我我会试一试。现在 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(string action, string controller) 第 4 行:{ 第 5 行:第 6 行:第 7 行:
@@

现在奇怪的是,注意它是如何在第 7 行“mnuHome.png”而不是 mnucontroller.png 上工作的。然而它说第 5 行是错误的。

我也有一个问题 ~ 在助手中不起作用。IE。~/Content 显示为文字字符串,而不是将其编译为正确的路径,该路径应始终指向应用程序的主文件夹。

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

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

特别是在“Razor 声明式助手”标题下的页面下方不到 1/4。从这里开始。

在此先感谢您的帮助。

4

1 回答 1

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")
于 2013-02-08T11:34:36.403 回答