asp.net-mvc - que - razor html
Usando @Html dentro de shared @helper en App_Code (6)
Agregue un segundo parámetro en su ayudante como abajo
@helper ReplaceCrLf(string strText,HtmlHelper<dynamic> html)
{
@Html.Raw(html.Encode(strText).Replace(Environment.NewLine, "<br />"));
}
cuando usas este helper, pasa this.Html como segundo parámetro
Estoy construyendo un sitio MVC3 muy básico mientras aprendo y estoy teniendo dificultades con el siguiente declarativo Razor html helper.
Dentro de RMB.cshtml dentro de la carpeta App_Code:
@helper ReplaceCrLf(string strText)
{
@Html.Raw(Html.Encode(strText).Replace(Environment.NewLine, "<br />"));
}
Dentro de mi vista index.cshtml:
@RMB.ReplaceCrLf(Model.Post)
Esto me da una excepción de referencia nula en Html en el helper, porque no parece saber qué es. Puedo evitar esto pasando Html de la vista a la ayuda, pero me preguntaba si hay otra manera para que mis ayudantes html compartidos puedan hacer referencia a Html sin que yo tenga que pasarlo a alguna vez que escribo.
Para completar, aquí está la solución alternativa de trabajo:
En RMB.cshtml en App_Code
@helper ReplaceCrLf(string strText, System.Web.Mvc.HtmlHelper Html)
{
@Html.Raw(Html.Encode(strText).Replace(Environment.NewLine, "<br />"));
}
En la vista index.cshtml
@RMB.ReplaceCrLf(Model.Post, Html)
Ahora agrego esto a cualquier archivo .cshtml en 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; } }
}
EDITAR: He modificado los nombres de las variables de ayuda en minúsculas, ya que he tenido algunos conflictos con los nombres de ayuda incorporados. He modificado el html helper para que sea genérico, lo que permite el uso de TextBoxFor, etc. ayudantes
Esto hace que esos maravillosos ayudantes estén disponibles para todos los métodos y funciones de @helper en el archivo.
¡Muchas gracias a Neshta por el concepto original!
Ejemplo completo para responder la pregunta:
En RMB.cshtml en la carpeta 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 />"));
}
En vista:
@RMB.ReplaceCrLf("line1/nline2") // No passing HtmlHelper
Es posible obtener ayudantes del PageContext:
var page = (WebViewPage) PageContext.Page;
var Url = page.Url;
var Html = page.Html;
var ViewBag = page.ViewBag;
// and so on
Uso (como ayudantes estándar):
@Url.Action("Index", "Home")
@Html.Raw("some encoded string")
Esto debería ser suficiente:
var message = new HtmlString(toast.Message.Replace(Environment.NewLine, "<br />"))
No es necesario usar Html.Raw().
Parece que los ayudantes en el trabajo de App_Code, pero no tiene acceso a MVC Html estándar. ayudantes
Usé una solución como seguir
@helper HtmlRaw(string s)
{
@(new HtmlString(s))
}
@helper ReplaceCrLf(string strText)
{
@HtmlRaw(HttpUtility
.HtmlEncode(strText)
.Replace(Environment.NewLine, "<br />"));
}