web-dev-qa-db-ja.com

Razorの3項式のHTMLリテラル

私は次のようなことをしようとしています

<div id="test">
    @(
        string.IsNullOrEmpty(myString)
          ? @:&nbsp;
          : myString   
    )
</div>

上記の構文は無効です。さまざまなことを試しましたが、機能しません。

27

次のことを試してください。

@Html.Raw(string.IsNullOrEmpty(myString) ? "&nbsp;" : Html.Encode(myString))

しかし、ビューをスパゲッティに変える必要がないように、この仕事をするヘルパーを書くことをお勧めします。

public static class HtmlExtensions
{
    public static IHtmlString ValueOrSpace(this HtmlHelper html, string value)
    {
        if (string.IsNullOrEmpty(value))
        {
            return new HtmlString("&nbsp;");
        }
        return new HtmlString(html.Encode(value));
    }
}

そしてあなたの見解では単に:

@Html.ValueOrSpace(myString)
51
Darin Dimitrov

あなたができること:

@{
   Func<dynamic, object> a = (true ? 
        (Func<dynamic, object>)(@<text> Works1 </text>) 
        : (Func<dynamic, object>)(@<text> Works2 </text>));
   @a(new object());
}

または、インライン化するには:

@(
  ((Func<dynamic, object>)(true == false 
      ? (Func<dynamic, object>)(@<text> Works2 </text>) 
      : (Func<dynamic, object>)(@<text> Works3 </text>)))
   (new object())
 )

(上記のすべてが1行でも機能することに注意してください。わかりやすくするために、これらを分離しました)

ただし、OPの本来の意図は機能するように変更することもできますが、このタイムラインブレークは保持する必要があります。

@(((Func<dynamic, object>)( true == true ? (Func<dynamic,object>)(@: Works
): (Func<dynamic, object>)(@: Not Works
)))("").ToString())

実際、演算子のオプションの1つにのみキャストが必要であり、Funcの最初のオプションとして動的を指定する必要はありません。何でも指定できます。評価する場合も、同じように何でも指定できます。 Funcの最初の引数と一致します。

たとえば、次のことができます(これが最短バージョンだと思います)。

    @(
      ((Func<int, object>)(true == false 
          ? (Func<int, object>)(@<text> Works2 </text>) 
          : @<text></text>))
       (0)
     )

よく使う場合は、Funcを次のように継承することをお勧めします。

public class Razor : Func<dynamic, object>{}

または、三項演算子のラッパーメソッド(またはラムダ式を記述して、通常の三項演算子を使用し、キャストを呼び出し先に延期することもできます)を作成することもできます。

1
yoel halb

新機能のおかげで更新されたもう1つのアプローチは、ビュー内にヘルパー関数を作成することです。これには、特に複数回呼び出す場合に、構文が少しすっきりするという利点があります。これは、@ Html.Raw()に依存しないため、@ Html.Encode()を呼び出す必要なしにクロスサイトスクリプティング攻撃からも安全です。

一番上にあるビューに次の情報を入力してください。

@helper NbspIfEmpty(string value) {
  if (string.IsNullOrEmpty(value)) {
    @:&nbsp;
  } else {
    @value
  }
}

次に、次のような関数を使用できます。

<div id="test">
    @NbspIfEmpty(myString)
</div>
0
Dalton Pearson