web-dev-qa-db-ja.com

App_Codeの共有@helper内で@Htmlを使用する

学習中に非常に基本的なMVC3サイトを構築していますが、次の宣言型Razorhtmlヘルパーで問題が発生しています。

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)
29
Treborbob

これを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; } }
}

編集:組み込みのヘルパー名と競合するため、ヘルパー変数名を小文字に変更しました。 TextBoxForなどのヘルパーを使用できるようにhtmlヘルパーを汎用に変更しました

これにより、これらのすばらしいヘルパーをファイル内のすべての@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
34
Ryan Buddicom

次のような回避策を使用しました

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

@helper ReplaceCrLf(string strText)
{
    @HtmlRaw(HttpUtility
                        .HtmlEncode(strText)
                        .Replace(Environment.NewLine, "<br />"));
}
21
edokan

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")
15
Neshta

App_Codeのヘルパーは機能しているように見えますが、標準のMVCHtmlにアクセスできません。ヘルパー

Razor:宣言型HTMLヘルパー を参照してください。

7
Dave

これで十分です:

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

Html.Raw().を使用する必要はありません

2

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

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

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

2
Atabaki