2013-06-06 14 views
5

私はヘルパーを作成しようとしているMVC4プロジェクトを持っています。私は "App_Code"と呼ばれるフォルダを追加し、そのフォルダにMyHelpers.cshtmlというファイルを追加しました。ここでは、そのファイルの内容全体は、以下のとおりです。名前 'Url'が現在のコンテキストエラーに存在しません

@helper MakeButton(string linkText, string actionName, string controllerName, string iconName, string classes) { 
    <a href='@Url.Action(linkText,actionName,controllerName)' class="btn @classes">Primary link</a> 
} 

私は「きれい」とソリューションを構築し

(私はこれが固定取得した後、私はそれらの後にに得るでしょう、いくつかの未使用のparamsがある知っています) 、エラーはありません。

ヘルパーを使用するページで、このコードを追加しました。

@MyHelpers.MakeButton("Back","CreateOffer","Merchant","","btn-primary") 

私はプロジェクトを実行しようとすると、私は次のエラーを取得:

Compiler Error Message: CS0103: The name 'Url' does not exist in the current context

を私はこれを書くための正しい方法を見つけるように見えることはできません - 私が間違って何をやっていますか?私はウェブで見た例と比べて正しいと思われますか?

+2

私はあなたのような何かをする必要があると思う:http://stackoverflow.com/questions/4710853/using-mvc-htmlhelper-extensions-from-razor-declarative-views。 – JeffB

+0

'@ Url.Action'ではなく、' @Html.ActionLink'を使用することを意味しましたか?私は2つのことについて私の答えに脚注を入れました。 –

答えて

4

JeffBのリンクからわかるように、ヘルパーファイルはUrlHelperオブジェクトにアクセスできません。

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

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

そして、私のヘルパーで、私は(例として、あなたを使用する)ん:私は、基本クラスを作成し、私のヘルパーについては

@helper MakeButton(string linkText, string actionName, 
    string controllerName, string iconName, string classes) { 

    System.Web.Mvc.UrlHelper urlHelper = 
     new System.Web.Mvc.UrlHelper(Request.RequestContext); 
    <a href='@urlHelper.Action(linkText,actionName,controllerName)' 
     class="btn @classes">Primary link</a> 
} 
4

この

は例の修正です

また
@inherits MyProject.HelperBase 
@using System.Web.Mvc 
@using System.Web.Mvc.Html 

@helper MakeButton(string linkText, string actionName, string controllerName, string iconName, string classes) { 
    <a href='@Html.ActionLink(linkText,actionName,controllerName)' class="btn @classes">Primary link</a> 
} 

、あなたがあなたの代わりにの(LinkExtensions経由)@Html.ActionLinkを使用することを意味するものではありませんでした確信しています210?後者は、linkText, actionName, controllerNameオーバーロードを持っていないようです、前者はですか?

+0

あなたの基本クラスは素晴らしいです!私が必要としていたことを正確にした、ありがとう。 – Dan

+0

完璧な、まさに私が探していたもの! – cuzzlor

関連する問題