2

上一篇文章中,我问了一个关于开始使用助手的问题。我成功了,但是当我尝试使用该技术时 1. 编写基于 Html.RenderAction 的不同助手,以及 2. 传入我自己的自定义助手时,一旦将它们导出到 App_Code 就会出错。

再次强调,它们是内联的,但不是在导出到 App_Code 时。

这是原始代码:

我的代码的许多部分只有以下内容:

    <section class="Box">
        @{ Html.RenderAction("PageOne"); }
    </section>

许多其他部分都有这个:

@if (@Model.PageTwo)
{
    <section class="Box">
        @{ Html.RenderAction("PageTwo"); }
    </section>
}

所以我的第一步是将以下内容提取到一个内联助手中,它可以在我上面的所有代码块中使用:

@helper Item(HtmlHelper html, string action, string htmlClass)
{
    <section class="@htmlClass">
        @{ html.RenderAction(action); }
    </section>
}

上面的帮助程序允许我用以下行替换所有看起来像上面第一个代码段的代码块:

@Item(Html, "PageOne", "Box")

然后我继续编写第二个助手,如下所示:

@helper Item(HtmlHelper html, string action, string htmlClass, bool test)
{
    if (test)
    {
        @Item(html, action, htmlClass)
    }
}

这个助手允许我用这一行替换所有看起来像上面第二个代码段的代码块:

@Item(Html, "PageTwo", "Box", @Model.ShowThisTorF)

我的主要问题再次是,这是内联的,所以当我将它删除到 App_Code 时为什么不这样做。

将其移至 App_Code 后,出现以下错误: 第一个问题是关于添加使用引用(因为 HtmlHelper 不明确),我在其中添加了以下代码行:

 @using HtmlHelper=System.Web.Mvc.HtmlHelper

这消除了第一个错误,但随后我得到另一个错误:

System.Web.Mvc.HtmlHelper 不包含“RenderAction”的定义,并且找不到接受“System.Web.Mvc.HtmlHelper”类型的第一个参数的扩展方法“RenderAction”(您是否缺少 using 指令或装配参考?)

我也尝试了其他参考,但没有结果:

 @using HtmlHelper=System.Web.WebPages.Html.HtmlHelper

我遇到的另一个问题是,一旦我让第一个块工作,我认为第二个块不会工作。即使它在内联工作得很好。

另外,我知道这很明显,但是如果我不在这里说,有人会在他们的回答中问它。当我将它移到文件 App_Code 中时,我确实根据需要添加了文件名前缀,因此一行代码块看起来像:

@Helpers.Item(Html, "PageOne", "Box")
@Helpers.Item(Html, "PageTwo", "Box", @Model.ShowThisTorF)

感谢您对此的任何帮助。

4

1 回答 1

4

App_Code 目录中正确的HtmlHelper内部助手是 System.Web.Mvc.HtmlHelper.

因为RenderAction是一种扩展方法,所以您需要using为声明它的命名空间添加一个@using System.Web.Mvc.Html

因此,假设您的文件已命名Helpers.cshtml并位于 App_Code 目录中,这应该可以工作:

@using HtmlHelper=System.Web.Mvc.HtmlHelper
@using System.Web.Mvc.Html

@helper Item(HtmlHelper html, string action, string htmlClass)
{
    <section class="@htmlClass">
        @{ html.RenderAction(action); }
    </section>
}
@helper Item(HtmlHelper html, string action, string htmlClass, bool test)
{
    if (test)
    {
        @Item(html, action, htmlClass)
    }
}

以及用法:

@Helpers.Item(Html, "PageOne", "Box")
@Helpers.Item(Html, "PageTwo", "Box", @Model.ShowThisTorF)
于 2013-02-11T12:01:14.743 回答