MVC4 URLHelper工作,但HTMLHelper不工作。我究竟做错了什么

时间:2013-02-11 10:54:51

标签: c# asp.net-mvc asp.net-mvc-4

previous post中,我问了一个关于帮助入门的问题。我很成功,但是当我尝试使用这种技术时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'并且没有扩展方法'RenderAction'接受a   可以找到类型'System.Web.Mvc.HtmlHelper'的第一个参数(是   你错过了使用指令或程序集引用?)

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

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

我遇到的另一个问题是,当我让第一个块工作时,我不认为第二个块会起作用。即使它在线内运行良好。

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

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

感谢您提供任何帮助。

1 个答案:

答案 0 :(得分: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)