Использование @Html внутри общего @helper в App_Code - PullRequest
29 голосов
/ 13 июля 2011

Я создаю очень простой сайт MVC3, пока я учусь, и у меня возникают трудности со следующим декларативным помощником Razor html.

Внутри RMB.cshtml внутри папки App_Code:

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

В моем представлении index.cshtml:

@RMB.ReplaceCrLf(Model.Post)

Это дает мне исключение нулевой ссылки на Html в помощнике, потому что кажется, что он не знает, что это такое.Я могу обойти это, передав Html из представления помощнику, но мне было интересно, есть ли другой способ, с помощью которого мои общие помощники html могут ссылаться на Html без необходимости передавать его какому-либо помощнику, которого я пишу?

Для полноты, вот рабочий способ:

В 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)

Ответы [ 6 ]

33 голосов
/ 08 февраля 2016

Теперь я добавляю это в любые файлы .cshtml в App_Code.

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

РЕДАКТИРОВАТЬ: изменил имена переменных помощника в нижний регистр, так как у меня были некоторые конфликты с именами встроенных помощников.Я изменил html-помощник, чтобы он стал универсальным, что позволяет использовать помощники TextBoxFor и т. Д.

Это делает эти замечательные помощники доступными для всех методов и функций @helper в файле.

Большое спасибо Завершить Пример для ответа на вопрос:

В RMB.cshtml в папке 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.ReplaceCrLf("line1\nline2") // No passing HtmlHelper
21 голосов
/ 14 августа 2012

Я использовал обходной путь, подобный следующему

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

@helper ReplaceCrLf(string strText)
{
    @HtmlRaw(HttpUtility
                        .HtmlEncode(strText)
                        .Replace(Environment.NewLine, "<br />"));
}
15 голосов
/ 02 октября 2014

Можно получить помощников из 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")
7 голосов
/ 13 июля 2011

Похоже, что помощники в App_Code работают, но у вас нет доступа к стандартному MVC Html.помощники

см. Бритва: декларативные помощники HTML

2 голосов
/ 06 сентября 2014

Этого должно быть достаточно:

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

Не нужно использовать Html.Raw().

2 голосов
/ 17 августа 2013

Добавьте второй параметр в ваш помощник, как показано ниже

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

при использовании этого помощника передайте this.Html в качестве второго параметра

...