HTML литерал в троичном выражении Razor - PullRequest
26 голосов
/ 28 июля 2011

Я пытаюсь сделать что-то вроде следующего

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

Приведенный выше синтаксис недействителен, я пробовал несколько разных вещей, но не могу заставить его работать.

Ответы [ 3 ]

51 голосов
/ 28 июля 2011

Попробуйте следующее:

@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)
1 голос
/ 21 июня 2013

Вы можете сделать:

@{
   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())
 )

(Обратите внимание, что все вышеперечисленное будет работать и в одной строке, я только что отделилдля ясности)

Однако первоначальное намерение ФП также может быть изменено для работы, но разрывы этой временной линии должны быть сохранены:

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

Примечание

На самом деле вам нужен приведение только к одной из опций в операторе, а также вам не нужно указывать динамику в качестве первой опции для Func, вы можете дать что угодно, и то же самое при оценке вашегоможет дать что-нибудь, если оно соответствует первому аргументу Func.

Например, вы можете сделать следующее (я думаю, что это самая короткая версия):

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

Если вы используете егомного, было бы хорошей идеей наследовать Func как в

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

Или можно даже написать метод-обертку (или даже лямбда-выражение в этом случае [я не уверен, но это возможно)использовать обычный троичный оператор и отложить приведение к окиль) для троичного оператора.

0 голосов
/ 28 июля 2011
@(string.IsNullOrEmpty(myString)? ":&nbsp;": myString)
...