Подтвердить что ты не робот

Использование @Html внутри shared @helper в App_Code

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

Внутри 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)
4b9b3361

Ответ 1

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

// Using 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: изменили имена вспомогательных переменных на нижний регистр, поскольку у меня были некоторые конфликты со встроенными именами помощников. Я изменил html-помощник на общий, который позволяет использовать помощники TextBoxFor и т.д.

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

Большое спасибо Neshta за оригинальную концепцию!


Полный пример ответа на вопрос:

В 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

Ответ 2

Я использовал обходной путь, как показано ниже

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

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

Ответ 3

Можно получить помощников из 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")

Ответ 5

Добавьте второй параметр в свой помощник ниже:

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

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

Ответ 6

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

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

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