2011-07-13 11 views
27

Sto costruendo un sito MVC3 molto semplice mentre imparo e sto riscontrando difficoltà con il seguente helper dichiarativo Razor html.Utilizzo di @Html all'interno di shared @helper in App_Code

All'interno RMB.cshtml all'interno della cartella App_Code:

@helper ReplaceCrLf(string strText) 
{ 
    @Html.Raw(Html.Encode(strText).Replace(Environment.NewLine, "<br />")); 
} 

Dentro la mia vista index.cshtml:

@RMB.ReplaceCrLf(Model.Post) 

Questo mi dà un'eccezione riferimento null in Html nel aiutante, perché doesn' t sembra sapere di cosa si tratta. Posso aggirare questo problema passando Html dalla vista all'helper, ma mi stavo chiedendo se c'è un altro modo per i miei helper html condivisi di essere in grado di fare riferimento a Html senza che io debba passarlo a un altro aiuto che scrivo?

Per completezza, ecco la soluzione di lavoro:

In RMB.cshtml in App_Code

@helper ReplaceCrLf(string strText, System.Web.Mvc.HtmlHelper Html) 
{ 
    @Html.Raw(Html.Encode(strText).Replace(Environment.NewLine, "<br />")); 
} 

In considerazione index.cshtml

@RMB.ReplaceCrLf(Model.Post, Html) 
+0

Sulla base di questa [risposta] (http: //stackoverflow.com/questions/4451287/razor-declarative-html-helpers/4453637#4453637), attualmente è una limitazione di mettere Helpers personalizzati in AppCode cartella. –

risposta

29

aggiungo questo a qualsiasi file .cshtml in App_Code ora.

// Using's are needed to ensure helpers function correctly. 
@using System.Web.Mvc; 
@using System.Web.Mvc.Html; 
@using System.Web.Mvc.Routing; 
@using System.Web.Mvc.Razor; 
@functions { 
    private static WebViewPage page { get { return PageContext.Page as WebViewPage; } } 
    private static System.Web.Mvc.HtmlHelper<dynamic> html { get { return page.Html; } } 
    private static UrlHelper url { get { return page.Url; } } 
    private static dynamic viewBag { get { return page.ViewBag; } } 
} 

EDIT: hanno modificato i nomi delle variabili di supporto in lettere minuscole come ho avuto alcuni conflitti con il costruito nel nomi aiutanti. Ho modificato l'helper html per essere generico che consente l'uso di TextBoxFor ecc helper

Ciò rende questi meravigliosi helper disponibili per tutti i metodi e le funzioni @helper nel file.

Mille grazie a Neshta per il concept originale!


Esempio completa per rispondere alla domanda:

In RMB.cshtml nella cartella App_Code

@functions { 
    public static WebViewPage page = (PageContext.Page as WebViewPage); 
    public static HtmlHelper<object> html = page.Html; 
} 

@helper ReplaceCrLf(string strText) 
{ 
    @html.Raw(Html.Encode(strText).Replace(Environment.NewLine, "<br />")); 
} 

In Vista:

@RMB.ReplaceCrLf("line1\nline2") // No passing HtmlHelper 
7

Sembra aiutanti nel lavoro, ma si App_Code non ho accesso a MVC Html standard. aiutanti

vedere Razor: Declarative HTML helpers

+0

Maledizione, che alla fine mi ha portato anche al blog originale dove ho visto come fare questo in primo luogo. Ecco in attesa di MVC4 quindi :( – Treborbob

+2

Ciao! Ho creato un'idea nella voce utente di ASP.NET relativa a questo: [Support @helper ExtensionMethod (questo HtmlHelper HTML) per le viste in APP_CODE] (http: //aspnet.uservoice. com/forums/41201-asp-net-mvc/suggerimenti/3670180-support-helper-extensionmethod-this-htmlhelper-ht) ... l'aiuto è apprezzato nel farlo arrivare in prima linea ... Grazie! –

20

ho usato una soluzione come seguire

@helper HtmlRaw(string s) 
{ 
    @(new HtmlString(s)) 
} 

@helper ReplaceCrLf(string strText) 
{ 
    @HtmlRaw(HttpUtility 
         .HtmlEncode(strText) 
         .Replace(Environment.NewLine, "<br />")); 
} 
+0

Questo è 100% ORO – pimbrouwers

+0

Bel trucco! – Kosmog

2

Aggiungi secondo parametro nel vostro aiutante come muggito

@helper ReplaceCrLf(string strText,HtmlHelper<dynamic> html) 
{ 
    @Html.Raw(html.Encode(strText).Replace(Environment.NewLine, "<br />")); 
} 

quando si utilizza questo helper passare this.Html come secondo Parametro

+0

La migliore risposta di gran lunga, grazie! – WhatIsHeDoing

1

Questo dovrebbe essere sufficiente:

var message = new HtmlString(toast.Message.Replace(Environment.NewLine, "<br />")) 

Non c'è bisogno di usare Html.Raw().

+1

Confermato, è stato corretto in CSHTML @ (nuovo HtmlString (ShortenedText)) SushiGuy

13

E 'possibile ottenere aiutanti dalla pageContext:

var page = (WebViewPage) PageContext.Page; 
var Url = page.Url; 
var Html = page.Html; 
var ViewBag = page.ViewBag; 
// and so on 

Usage (come helper standard):

@Url.Action("Index", "Home") 
@Html.Raw("some encoded string") 
Problemi correlati