2013-06-06 20 views
5

Ho un progetto MVC4 per il quale sto cercando di creare un helper. Ho aggiunto una cartella chiamata "App_Code", e in quella cartella ho aggiunto un file chiamato MyHelpers.cshtml. Ecco l'intero contenuto di quel file:Il nome "Url" non esiste nel contesto attuale errore

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

(So che ci sono alcuni params inutilizzati, vado a prendere a quelli più tardi, dopo che ottenere questo riparato)

I "pulito" e costruito la soluzione , nessun errore.

Nella pagina che utilizza l'helper, ho aggiunto questo codice.

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

Quando si tenta di eseguire il progetto, ottengo il seguente errore:

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

io non riesco a trovare il modo corretto di scrivere questo - cosa faccio di sbagliato? Sembra corretto rispetto agli esempi che ho visto sul web?

+2

Penso che sia necessario fare qualcosa del genere: http://stackoverflow.com/questions/4710853/using-mvc-htmlhelper-extensions-from-razor-declarative-views. – JeffB

+0

Volevi usare '@ Html.ActionLink' piuttosto che' @ Url.Action'? Ho inserito una nota a piè di pagina nella mia risposta a proposito dei due. –

risposta

4

Come suggerisce il collegamento di JeffB, il file di supporto non ha accesso all'oggetto UrlHelper.

Questa è una correzione esempio:

@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

Per i miei aiutanti creo una classe di base:

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

E poi nel mio aiuto io (a vostro uso come esempio):

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

Inoltre, sei sicuro di non intendeva usare @Html.ActionLink (via LinkExtensions) al posto di @Url.Action? Quest'ultimo non sembra avere un sovraccarico linkText, actionName, controllerName, il primo lo fa?

+0

La tua classe base è geniale! Ho fatto esattamente quello di cui avevo bisogno, grazie. – Dan

+0

Sì perfetto, esattamente quello che stavo cercando! – cuzzlor

Problemi correlati