import System.Web.Mvc.UrlHelper

 

正常狀況我在一個 view 頁面使用 UrlHelper 時都是可正常動作的,如下

Index.cshtml

@{
    ViewBag.Title = "Home Page";
}

@Url.Action("About")

畫面為

 

但現我在 App_Code 裡面使用 UrlHelper 卻失敗了,如下

資料結構為

Index.cshtml 改為

@{
    ViewBag.Title = "Home Page";
}

@Print.ShowPath("About")

Print.cshtml 為

@helper ShowPath(string pathName)
{
    Url.Action(pathName);
}

出現了這種錯誤訊息「The name 'Url' does not exist in the current context」

 

因為 UrlHelper 沒有被 include 進來,那就手動來呼叫 UrlHelper 吧

將 Print.cshtml 改為

@using System.Web.Mvc;

@helper ShowPath(string pathName)
{
    UrlHelper myUrlHelper = new UrlHelper(Request.RequestContext);
    <p>
        @myUrlHelper.Action(pathName)
    </p>
}

將 Print.cshtml 改成這樣也是成立的

@using System.Web.Mvc;

@helper ShowPath(string pathName)
{
    UrlHelper myUrlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);

    <p>
        @myUrlHelper.Action(pathName)
    </p>
}

 

看有人這麼寫也行,但我還是不太知道其原理,如下

新增 HelperBase.cs 於 App_Code 資料夾內

HelperBase.cs 內容為

using System.Web.WebPages;
using System.Web.Mvc;

namespace WebApplication1.App_Code
{
    public class HelperBase : HelperPage
    {
        public static new HtmlHelper Html
        {
            get { return ((WebViewPage)WebPageContext.Current.Page).Html; }
        }
        public static UrlHelper Url
        {
            get { return ((WebViewPage)WebPageContext.Current.Page).Url; }
        }
    }
}

於 Print.cshtml 裡繼承 HelperBase

@inherits WebApplication1.App_Code.HelperBase

@helper ShowPath(string pathName)
{
    <p>
        @Url.Action(pathName)
    </p>
}

 

參考資料:

修改System.Web.Mvc.WebViewPage創建自己的pageBase

The view must derive from WebViewPage, or WebViewPage<TModel>. (The view at ‘~/Views/home/index.cshtml’ must derive from WebViewPage, or WebViewPage<TModel>.)