2011-07-13 15 views
27

Buduję bardzo prostą stronę MVC3, podczas gdy ja się uczę i mam problemy z następującym deklaratywnym pomocnikiem html Razor.Używanie @Html wewnątrz shared @helper w App_Code

Wewnątrz RMB.cshtml wewnątrz folderze App_Code:

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

Wewnątrz moim zdaniem index.cshtml:

@RMB.ReplaceCrLf(Model.Post) 

To daje mi wyjątku null odniesienia w HTML pomocnika, bo nie robi” wydaje się wiedzieć, co to jest. Mogę obejść to, przechodząc HTML z widoku do helpera, ale zastanawiałem się, czy istnieje inny sposób dla moich udostępnionych pomocników html, aby móc odwoływać się do Html bez mojego przekazywania go, aby kiedykolwiek pomógł mi pisać?

Dla kompletności, tutaj jest obejście robocze:

W RMB.cshtml w App_Code

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

W index.cshtml widzenia

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

podstawie tej [Odpowiedź] (http: //stackoverflow.com/questions/4451287/razor-declarative-html-helpers/4453637#4453637), jest obecnie ograniczeniem wprowadzania niestandardowych pomocników w kodzie AppCode teczka. –

Odpowiedz

29

dodam to do wszystkich plików .cshtml w App_Code teraz.

// 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: Zmieniłeś nazwy zmiennych pomocniczych na małe jak miałem jakieś konflikty z wbudowaną pomocników nazwisk. Zmodyfikowałem helper html jako ogólny, który pozwala używać TextBoxFor itp. Pomocników

Dzięki temu te wspaniałe pomocniki są dostępne dla wszystkich metod @helper i funkcji w pliku.

Serdeczne podziękowania dla Neshta za oryginalną koncepcję!


Kompletny przykład odpowiedzieć na pytanie:

W RMB.cshtml w folderze 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 />")); 
} 

W Widok:

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

Wygląda pomocników w pracy App_Code ale ciebie nie mają dostępu do standardowego Html MVC. pomocnicy

zobaczyć Razor: Declarative HTML helpers

+0

Pocałuję, że w końcu zabrałem mnie na oryginalny blog, na którym zobaczyłem, jak to zrobić w pierwszej kolejności. Tutaj czekamy na MVC4, a następnie :( – Treborbob

+2

Hi! Stworzyłem pomysł w głosie użytkownika ASP.NET w związku z tym: [Support @helper ExtensionMethod (ten HTML htmlHelper) dla widoków w APP_CODE] (http: //aspnet.uservoice. com/forums/41201-asp-net-mvc/suggestions/3670180-support-helper-extensionmethod-this-htmlhelper-ht) ... pomoc jest doceniana, sprawiając, że trafia ona na pierwszy plan ... Dzięki! –

20

użyłem obejście jak po

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

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

to 100% GOLD – pimbrouwers

+0

Przyjemne obejście! – Kosmog

2

Dodaj drugi parametr w swoim pomocnikiem jak poniżej

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

podczas korzystania z tego pomocnika przechodzą this.Html jako sekundę Parametr

+0

Najlepsza odpowiedź jak dotąd, dziękuję! – WhatIsHeDoing

1

To powinno wystarczyć:

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

Nie ma potrzeby korzystania Html.Raw().

+1

Potwierdzona, zrobiła to w CSHTML @ (nowy HtmlString (ShortenedText)) SushiGuy

13

Jest to możliwe, aby uzyskać pomocników z pageContext:

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

użytkowania (jak standardowe pomocników):

@Url.Action("Index", "Home") 
@Html.Raw("some encoded string") 
Powiązane problemy