我正在构建一个非常基本的MVC3网站,而我学习并且我在使用以下声明性Razor html帮助器时遇到了困难。
在App_Code文件夹中的RMB.cshtml里面:
@helper ReplaceCrLf(string strText)
{
@Html.Raw(Html.Encode(strText).Replace(Environment.NewLine, "<br />"));
}
在我的index.cshtml视图中:
@RMB.ReplaceCrLf(Model.Post)
这给了我帮助器中Html的空引用异常,因为它似乎不知道它是什么。我可以通过将Html从视图传递给帮助器来解决这个问题,但我想知道是否有另一种方法可以让我的共享html助手能够引用Html而不必将其传递给我写的助手?
为了完整起见,这是工作方法:
App_Code中的RMB.cshtml
@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 :(得分:32)
我现在将它添加到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; } }
}
编辑:已将辅助变量名修改为小写,因为我与内置帮助程序名称有一些冲突。我修改了html帮助器是通用的,它允许使用TextBoxFor等帮助器
这使得这些精彩的帮助程序可用于文件中的所有@helper方法和函数。
非常感谢Neshta原始概念!
回答问题的完整示例:
在App_Code文件夹中的RMB.cshtml中
@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
答案 1 :(得分:21)
我使用了像下面这样的解决方法
@helper HtmlRaw(string s)
{
@(new HtmlString(s))
}
@helper ReplaceCrLf(string strText)
{
@HtmlRaw(HttpUtility
.HtmlEncode(strText)
.Replace(Environment.NewLine, "<br />"));
}
答案 2 :(得分:14)
可以从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")
答案 3 :(得分:7)
看起来App_Code中的帮助程序工作,但您无权访问标准MVC Html。助手
答案 4 :(得分:2)
在助手中添加第二个参数,如下所示
@helper ReplaceCrLf(string strText,HtmlHelper<dynamic> html)
{
@Html.Raw(html.Encode(strText).Replace(Environment.NewLine, "<br />"));
}
当你使用这个助手时,将this.Html作为第二个参数传递
答案 5 :(得分:2)
这应该足够了:
var message = new HtmlString(toast.Message.Replace(Environment.NewLine, "<br />"))
无需使用Html.Raw().