30

我在学习时正在构建一个非常基本的 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)
4

6 回答 6

41

我现在将它添加到 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
于 2016-02-08T12:14:24.377 回答
21

我使用了如下解决方法

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

@helper ReplaceCrLf(string strText)
{
    @HtmlRaw(HttpUtility
                        .HtmlEncode(strText)
                        .Replace(Environment.NewLine, "<br />"));
}
于 2012-08-14T08:25:37.490 回答
16

可以从 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")
于 2014-10-02T10:01:52.220 回答
7

看起来 App_Code 中的助手可以工作,但您无权访问标准 MVC Html。帮手

请参阅Razor:声明性 HTML 帮助程序

于 2011-07-13T13:28:46.237 回答
2

在您的助手中添加第二个参数,如下所示

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

当您使用此助手时,将 this.Html 作为第二个参数传递

于 2013-08-17T09:08:08.377 回答
2

这应该足够了:

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

无需使用Html.Raw().

于 2014-09-05T23:32:23.687 回答