在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)
感谢您提供任何帮助。
答案 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)