2013-06-06 11 views
5

Ich habe ein MVC4-Projekt, für das ich versuche, einen Helfer für zu erstellen. Ich habe einen Ordner namens "App_Code" hinzugefügt, und in diesem Ordner habe ich eine Datei namens MyHelpers.cshtml hinzugefügt. Hier sind der gesamte Inhalt der Datei:Der Name 'Url' existiert nicht im aktuellen Kontextfehler

@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> 
} 

(Ich weiß, es gibt einige nicht verwendete params, ich zu denen später bekommen werde, nachdem ich dieses Problem behoben werden)

I „gereinigt“ und baute die Lösung , keine Fehler.

In der Seite, die den Helfer verwendet, habe ich diesen Code hinzugefügt.

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

Wenn ich versuche, das Projekt auszuführen, erhalte ich folgende Fehlermeldung:

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

Ich kann nicht scheinen, den richtigen Weg zu finden, diese zu schreiben - was mache ich falsch? Es scheint richtig zu sein im Vergleich zu Beispielen, die ich im Internet gesehen habe?

+2

Ich denke, dass Sie etwas tun müssen: http://stackoverflow.com/questions/4710853/using-mvc-htmlhelper-extensions-from-razor-declarative-views. – JeffB

+0

Wollten Sie '@ Html.ActionLink' und nicht' @ Url.Action' verwenden? Ich habe eine Fußnote in meine Antwort zu den beiden geschrieben. –

Antwort

4

Wie der Link von JeffB andeutet, hat Ihre Hilfsdatei keinen Zugriff auf das UrlHelper-Objekt.

Dies ist ein Beispiel fix:

@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

Für meine Helfer ich eine Basisklasse erstellen:

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; } 
     } 
    } 
} 

Und dann in meinem Helfer mich (Sie als Beispiel verwenden):

@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> 
} 

auch Sie sind sicher, dass Sie nicht @Html.ActionLink verwenden wollte (via LinkExtensions) statt @Url.Action? Letzteres scheint keine linkText, actionName, controllerName Überlast zu haben, die erstere?

+0

Ihre Basisklasse ist brilliant! Hat genau das getan, was ich brauchte, danke. – Dan

+0

Ja perfekt, genau das, was ich gesucht habe! – cuzzlor

Verwandte Themen