web-dev-qa-db-ja.com

Razorで@helper構文を使用して文字列を返すことはできますか?

私は_app_code_に次のようなRazorHelpers.cshtmlファイルを持っています:

_@using Molecular.AdidasCoach.Library.GlobalConstants

@helper Translate(string key)
{
    @GlobalConfigs.GetTranslatedValue(key)
}
_

しかし、その結果を@Html.ActionLink(...)のリンクテキストとして使用したい場合があります。結果を文字列にキャストできません。

HTMLと_@Html_ヘルパー内でそれらを使用できるように、Razorヘルパーからプレーン文字列を返す方法はありますか?

26
Mathletics

RazorヘルパーはHelperResultオブジェクトを返します。

ToString()を呼び出すことにより、生のHTMLを取得できます。

詳細については、 私のブログ投稿 を参照してください。

30
SLaks

あなたの場合、これもうまくいくと思います:

@(GlobalConfigs.GetTranslatedValue(key))

追加サンプル:

@helper GetTooltipContent()
{       
    if(Model.SubCategoryType == SUBCATTYPE.NUMBER_RANGE)
    {
        @(string.Format("{0} to {1}", Model.SubCategoryMinimum, Model.SubCategoryMaximum))
    }
    else if(Model.SubCategoryType == SUBCATTYPE.NUMBER_MAXIMUM)
    {
        @("<= " + Model.SubCategoryMaximum)
    }
    else if(Model.SubCategoryType == SUBCATTYPE.NUMBER_MINIMUM)
    {
        @(">= " + Model.SubCategoryMinimum)
    }
}
16

@helperHelperResult以外の型を返すようにする方法はないと思います。ただし、戻り値の型がstringの関数を使用することもできます。

@functions {
    public static string tr(string key) {
        return GlobalConfigs.GetTranslatedValue(key);
    }
}

その後

@Html.ActionLink(tr("KEY"), "action", "controller")

参照 http://www.mikesdotnetting.com/article/173/the-difference-between-helpers-and-functions-in-webmatrix

編集: MVC Razor:Helper result in html.actionlink ヘルパーを提案can@Html.Raw(GlobalConfigs.GetTranslatedValue(key));を使用して文字列を返す

15
Spikolynn

次のステートメントは、MVCバージョン_5.2.4.0_に対して検証されています。 Razorヘルパーからプレーン文字列を返し、HTMLと@Htmlヘルパーの両方で使用できるようにする方法はありますか?

組み込みのMVCヘルパーがどのように機能するかを調査しましたが、実際には_System.Web.Mvc.WebViewPage_クラスのプロパティなので、_@helper_機能とは関係ありません。

_@helper_は、文字列をHTMLとしてエンコードし、コードがRazorコードブロック(別名_@{ code }_)内のビューにコピーアンドペーストされるかのように機能します。一方、_@functions_はRazorブロック内で使用されることになっています。

まあ、コードがコピー貼り付けされているかのように_@helper_が機能する場合は、@Html.Raw("<p>cool</p>")を使用しないのはなぜですか?ヘルパー内ではHtmlプロパティがnullだからです。どうして?何も思いつきません。

では、関数を使用して文字列を返し、その結果に_@Html.Raw_を適用します。それは動作しますか?はい、そうです。次の例では、DOMに_<p>_要素を作成します。

_@functions
{
    static string GetString()
    {
        return "<p>awesome</p>";
    }
}

@Html.Raw(GetString())
_

_@Html.Raw_が必要な理由がわからない場合は、@ SLaksの Razor自動HTMLエンコーディング に関するこの素晴らしい記事をお読みください。

組み込みのプロパティを使用したアプローチはどうですか?はい、そのように機能するパブリックメソッドで静的クラスを作成することは可能です。唯一の問題は、_@using_キーワードを使用して、ビューに名前空間を含める必要があることです。それを改善できますか?はい、Viewsフォルダー内の_Web.config_に名前空間を追加します。例:

Helpers/Global.cs

_namespace WebApp.Helpers
{
    public static class Global
    {
        public static IHtmlString GetString()
        {
            return new HtmlString("Something <b>cool</b>");
        }
    }
}
_

Views/Web.config

_<?xml version="1.0"?>
<configuration>
  <system.web.webPages.razor>
    <Host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.4.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <!-- Add to the end of namespaces tag. -->
        <add namespace="WebApp.Helpers" />
_

使用法

_@Global.GetString()
_

結果は何ですか?テキストSomethingと追加の_<b>_要素がDOMで見つかります。 Requestにアクセスする必要がある場合は、ヘルパーメソッドにHttpContextBaseパラメーターを追加し、呼び出し時に_WebViewPage.Context_プロパティを渡すだけです。

良くなりますか?はい、いつものように。同じ出力を_@helper_および_@functions_で作成できます。

_@helper GetString1()
{
    @(new HtmlString("Something <b>awesome</b>"))
}

@functions {
    public static IHtmlString GetString2()
    {
        return new HtmlString("Something <b>awesome</b>");
    }
}

@MyHelper.GetString1()
@MyHelper.GetString2()
_

回答

OPの質問に関しては、stringを返す関数を作成するために@Spikolynnのアプローチをお勧めします。ただし、ヘルパーでC#コードの多くの行を記述する必要がある場合は、静的クラスヘルパーを使用することをお勧めします。

0
MatrixRonny