MVC Helpers在线工作,但不在App_Code中工作

时间:2013-02-08 11:32:39

标签: c# asp.net-mvc asp.net-mvc-3 model-view-controller

最初我为每个菜单项重复了一行代码,只是对各种菜单项值进行了硬编码,但后来我找到了助手并教导我会尝试一下。现在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。从这里开始。

提前感谢您的帮助。

1 个答案:

答案 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")