27

में साझा @helper के अंदर @Html का उपयोग करके मैं सीखने के दौरान एक बहुत ही बुनियादी एमवीसी 3 साइट बना रहा हूं और मुझे निम्न घोषणात्मक रेजर एचटीएमएल सहायक के साथ कठिनाई हो रही है।App_Code

अंदर RMB.cshtml App_Code फ़ोल्डर के अंदर:

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

मेरी index.cshtml दृश्य के अंदर:

@RMB.ReplaceCrLf(Model.Post) 

यह मैं सहायक में एचटीएमएल पर एक अशक्त संदर्भ अपवाद देता है, क्योंकि यह 'नहीं करता है टी यह प्रतीत होता है कि यह क्या है। मैं एचटीएमएल को देखने के लिए सहायक से पास कर सकता हूं, लेकिन मैं सोच रहा था कि मेरे साझा एचटीएमएल हेल्पर्स के लिए एचटीएमएल को संदर्भित करने में सक्षम होने के लिए कोई और तरीका है, बिना मुझे कभी भी सहायक में लिखने के लिए? RMB.cshtml में

App_Code

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

में index.cshtml ध्यान में रखते हुए

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

इस [जवाब] (http के आधार पर: 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 />")); } 

देखें में

RMB.cshtml में:


संपूर्ण उदाहरण सवाल का जवाब देने: //stackoverflow.com/questions/4451287/razor-declarative-html-helpers/4453637#4453637), वर्तमान में यह ऐपकोड में कस्टम हेल्पर्स डालने की सीमा है फ़ोल्डर। –

उत्तर

29

मैं इस जोड़ने App_Code में अब किसी भी .cshtml फ़ाइलों के लिए।

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

संपादित करें: लोअरकेस के रूप में मैं सहायकों के नाम में बनाया के साथ कुछ संघर्ष किया है सहायक चर नाम संशोधित किया है। मैंने जेनेरिक होने के लिए एचटीएमएल हेल्पर को संशोधित किया है जो टेक्स्टबॉक्स फोर इत्यादि के उपयोग की अनुमति देता है

यह उन अद्भुत सहायकों को फ़ाइल में सभी @helper विधियों और कार्यों के लिए उपलब्ध कराता है।

मूल अवधारणा के लिए Neshta पर बहुत धन्यवाद!

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

App_Code काम, लेकिन आप में सहायकों की तरह लग रहा:

पूर्णता के लिए, यहाँ काम कर समाधान नहीं है मानक एमवीसी एचटीएमएल तक पहुंच नहीं है। सहायकों

Razor: Declarative HTML helpers

+0

इसे कम करें, अंततः मुझे मूल ब्लॉग पर ले गया जहां मैंने देखा कि इसे पहले स्थान पर कैसे किया जाए। यहां एमवीसी 4 के लिए तत्पर हैं :( – Treborbob

+2

हाय! मैंने एएसपी.NET उपयोगकर्ता से संबंधित एक आवाज बनाई है: [support @helper ExtensionMethod (यह HtmlHelper HTML) APP_CODE में दृश्यों के लिए [http: //aspnet.uservoice। कॉम/फ़ोरम/41201-एएसपी-नेट-एमवीसी/सुझाव/3670180-सपोर्ट-हेल्पर-एक्सटेंशनमेथ-यह-एचटीएमएलहेपर-एचटी) ... इसे सामने की रेखाओं में लाने में मदद की सराहना की जाती है ... धन्यवाद! –

20

मैं निम्नलिखित

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

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

यह 100% गोल्ड – pimbrouwers

+0

अच्छा कामकाज! – Kosmog

2

के रूप में अपने सहायक में दूसरा पैरामीटर जोड़े की तरह एक वैकल्पिक हल के लिए इस्तेमाल किया देखने

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

जब आप इस सहायक का उपयोग दूसरे के रूप में this.Html पारित पैरामीटर

+0

अब तक का सबसे अच्छा जवाब, धन्यवाद! – WhatIsHeDoing

1

यह पर्याप्त होना चाहिए:

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

कोई ज़रूरत नहीं Html.Raw().

+1

पुष्टि की, क्या यह सीएसएचटीएम @ (नया एचटीएमएलस्ट्रिंग (शॉर्टडेक्स्ट)) में सही था SushiGuy

13

उपयोग करने के लिए यह PageContext से सहायकों पाने के लिए संभव है: (मानक सहायकों की तरह)

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

उपयोग:

@Url.Action("Index", "Home") 
@Html.Raw("some encoded string") 
संबंधित मुद्दे