4

機能があり@heper paginationます。これは、2つの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

名前空間をインポートする必要がありますか、それとも問題がどこにあるのですか?

私がやりたい方法は完璧ですか?

4

3 に答える 3

13

実際には、次のようにApp_Codeフォルダー内のヘルパーからViewBagにアクセスできます。

@helper buildLinks()
{
    var p = (System.Web.Mvc.WebViewPage)PageContext.Page;

    var vb = p.ViewBag;

    /* vb is your ViewBag */
}
于 2012-08-15T09:41:32.793 に答える
4

ヘルパーをApp_Codeに移動した場合は、ビューから関数に、、を渡す必要がありますViewBagUrlHelperHtmlHelper

元。

App_codeのhtmlヘルパー関数

@helper SomeFunc(System.Web.Mvc.HtmlHelper Html)
{
    ...
}

あなたの視点から、

@SomeFunc("..", Html) // passing the html helper
于 2012-07-18T04:59:43.677 に答える
4

Markが言ったように、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)
于 2012-07-18T06:12:33.137 に答える