Использование @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)
Ответы
Ответ 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")
Ответ 4
Похоже, что помощники в App_Code работают, но у вас нет доступа к стандартному MVC Html. хелперы
см. Razor: декларативные HTML-помощники
Ответ 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().