私は_app_code
_に次のようなRazorHelpers.cshtmlファイルを持っています:
_@using Molecular.AdidasCoach.Library.GlobalConstants
@helper Translate(string key)
{
@GlobalConfigs.GetTranslatedValue(key)
}
_
しかし、その結果を@Html.ActionLink(...)
のリンクテキストとして使用したい場合があります。結果を文字列にキャストできません。
HTMLと_@Html
_ヘルパー内でそれらを使用できるように、Razorヘルパーからプレーン文字列を返す方法はありますか?
あなたの場合、これもうまくいくと思います:
@(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)
}
}
@helper
がHelperResult
以外の型を返すようにする方法はないと思います。ただし、戻り値の型が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));
を使用して文字列を返す
次のステートメントは、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
_に名前空間を追加します。例:
_namespace WebApp.Helpers
{
public static class Global
{
public static IHtmlString GetString()
{
return new HtmlString("Something <b>cool</b>");
}
}
}
_
_<?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#コードの多くの行を記述する必要がある場合は、静的クラスヘルパーを使用することをお勧めします。