40

MVC 3 RTM を使用すると、奇妙な結果が得られNullReferenceExceptionます:

@helper TestHelperMethod() {
    var extra = "class=\"foo\"";
    <div @Html.Raw(extra)></div>
}

Html(タイプ のHtmlHelper) がであることがわかりnullます。

通常のビューでこれを見たことはありません。私は Razor で宣言型ヘルパー メソッドを試し始めています (これまでのところ、それらは少し制限されているようです)。

4

6 に答える 6

41

Drew Noakes の提案を使用して、私は今のところトリックを実行する回避策にたどり着きました。これは、MVC の新しいバージョンで問題が解決されたら簡単に削除できます (つまり、それを壊すような変更がない場合:) )

目標は、NullReferenceException を持たずに、App_Code のファイルに存在する宣言型ヘルパー メソッド内で HtmlHelper を使用できるようにすることです。これを解決するために、App_Code のすべてのファイルに以下を含めました。

@using System.Web.Mvc;

@functions
{
    private static new HtmlHelper<object> Html
    {
        get { return ((WebViewPage)CurrentPage).Html; }
    }

    private static UrlHelper Url
    {
        get { return ((WebViewPage)CurrentPage).Url; }
    }
}

次のヘルパーを(同じファイルに)書くことができるので、これはうまくいくようです:

@helper PrintAsRaw(string htmlString)
{
     @Html.Raw(htmlString)
}

明らかに、ヘルパー メソッドは単なる例です。このソリューションには、App_Code のすべてのヘルパー宣言ファイルに @functions 宣言を導入する必要があるという欠点がありますが、ビューに単純に書き込むことができるため、ヘルパーの呼び出しが複雑になることはありません。

@MyAppCodeFile.PrintAsRaw("<p>My paragraph</p>")

お役に立てれば...

于 2011-08-11T11:00:52.767 に答える
35

これは、これらのヘルパーの既知の制限です。1 つの可能性は、パラメーターとして渡すことです。

@helper TestHelperMethod(HtmlHelper html) {
    var extra = "class=\"foo\"";
    <div@html.Raw(extra)></div>
}

もう 1 つの可能性は、ヘルパーを拡張メソッドとして記述することです。

public static class HtmlExtensions
{
    public static MvcHtmlString TestHelperMethod(this HtmlHelper)
    {
        var div = new TagBuilder("div");
        div.AddCssClass("foo");
        return MvcHtmlString.Create(div.ToString());
    }
}

その後:

@Html.TestHelperMethod()
于 2011-03-12T14:58:52.393 に答える
25

それがポイントではないことはわかっていHtml.Raw(value)ますが、System.Web.Mvc.dllのソースコードに従って、Googleでこの質問を見つけるときに使用したいと思っていたのであれば、Html.Rawは次のとおりです。

public IHtmlString Raw(string calue)
{
    return new HtmlString(value);
}

だから私は@(new HtmlString(value))うまく機能するヘルパーで使用しました。

于 2012-04-30T10:13:51.447 に答える
15

交換するだけ

 @Html.Raw(extra)

@(new HtmlString(extra))
于 2013-04-24T13:37:29.753 に答える
5

私は問題の原因を知っていると思います...

Htmlプロパティ ゲッターの定義は次のとおりです。

public static HtmlHelper Html {
    get { 
        WebPage currentWebPage = CurrentPage as WebPage;
        if (currentWebPage == null) {
            return null;
        } 
        return currentWebPage.Html;
    } 
} 

ヘルパー メソッドにブレークポイントを設定するとCurrentPage、実際には のインスタンスではないWebPageため、null値が表示されます。

これが型階層ですCurrentPage(私のクラス名は少し改ざんされています):

ASP._Page_Views_mycontroller_View_cshtml
  My.Site.MyWebViewPage`1
    System.Web.Mvc.WebViewPage`1
      System.Web.Mvc.WebViewPage
        System.Web.WebPages.WebPageBase
          System.Web.WebPages.WebPageRenderingBase
            System.Web.WebPages.WebPageExecutingBase
              System.Object

ビューの基本クラスが Web.config で指定されていることに注意してください。

<system.web.webPages.razor>
  <pages pageBaseType="My.Site.MyWebViewPage">
    ...

これは、ジェネリック形式と非ジェネリック形式の両方で定義されています。

public abstract class MyWebViewPage : WebViewPage { ... }
public abstract class MyWebViewPage<TModel> : WebViewPage<TModel> { ... }

したがって、この問題が他の人に発生しない場合は、おそらくカスタム を使用していませんpageBaseType

グローバルにアクセスできるようにするために、@helper宣言を配置したことにも注意してください。App_Code\Helpers.cshtml

私は何か間違ったことをしていますか、それともこれはバグですか?

EDITこれを既知の問題として指摘してくれたDarinに感謝します。それでも、Htmlプロパティが次のように再定義されないのはなぜですか。

public static HtmlHelper Html {
    get { 
        WebPage currentWebPage = CurrentPage as WebPage;
        if (currentWebPage != null) {
            return currentWebPage.Html;
        } 
        WebViewPage currentWebViewPage = CurrentPage as WebViewPage;
        if (currentWebViewPage != null) {
            return currentWebViewPage.Html;
        } 
        return null;
    } 
} 
于 2011-03-12T13:18:05.417 に答える
1

私は同じ問題を抱えていましたが、このコード行でうまくいきました。これは HtmlHelper を使用するためのソリューションではありません。宣言型のかみそりヘルパーで RAW html を記述する方法にすぎません。

@{CurrentPage.WriteLiteral("html code");}
于 2012-03-06T11:57:10.917 に答える