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 で null 参照例外が発生します。これは、それが何であるかを認識していないように見えるためです。ビューからヘルパーに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

次のようにヘルパーに 2 番目のパラメーターを追加します。

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

このヘルパーを使用するときは、this.Html を 2 番目のパラメーターとして渡します

于 2013-08-17T09:08:08.377 に答える