我有一个@heper pagination
功能。这是两个View帮助器ViewBag
和Url
。
这个分页将被很多页面使用,所以我将代码从Views
文件夹中移除
到App_Code
文件夹。 App_Code/Helper.cshtml
@helper buildLinks(int start, int end, string innerContent)
{
for (int i = start; i <= end; i++)
{
<a class="@(i == ViewBag.CurrentPage ? "current" : "")" href="@Url.Action("index", "country", new { page = i })">@(innerContent ?? i.ToString())</a>
}
}
但现在我运行应用程序。它抛出错误
error CS0103:The name 'ViewBag' does not exist in the current context
error CS0103:The name 'Url' does not exist in the current context
我是否需要导入任何命名空间或问题所在?
我想做的事情是完美的吗?
答案 0 :(得分:13)
实际上,您可以从App_Code文件夹中的帮助程序访问ViewBag,如下所示:
@helper buildLinks()
{
var p = (System.Web.Mvc.WebViewPage)PageContext.Page;
var vb = p.ViewBag;
/* vb is your ViewBag */
}
答案 1 :(得分:4)
如果您将助手移至App_Code,则必须将ViewBag
,UrlHelper
,HtmlHelper
传递给您观看的功能。
实施例
app_code中的html帮助函数
@helper SomeFunc(System.Web.Mvc.HtmlHelper Html)
{
...
}
从您的角度来看,
@SomeFunc("..", Html) // passing the html helper
答案 2 :(得分:4)
正如马克所说,你应该将UrlHelper作为参数传递给你的助手:
@helper buildLinks(int start, int end, int currentPage, string innerContent, System.Web.Mvc.UrlHelper url)
{
for (int i = start; i <= end; i++)
{
<a class="@(i == currentPage ? "current" : "")" href="@url.Action("index", "country", new { page = i })">@(innerContent ?? i.ToString())</a>
}
}
然后像这样称呼它:
@Helper.buildLinks(1, 10, ViewBag.CurrentPage, "some text", Url)