Подтвердить что ты не робот

Html литерал в тройном выражении Razor

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Или сделать это inline do:

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

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

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

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

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

Ответ 3

Еще один обновленный подход, благодаря новым функциям, заключается в создании вспомогательной функции прямо в представлении. Это имеет преимущество в том, что делает синтаксис немного чище, особенно если вы собираетесь вызывать его несколько раз. Это также безопасно от межсайтовых скриптовых атак без необходимости вызывать @Html.Encode(), поскольку он не зависит от @Html.Raw().

Просто поместите следующую строку прямо наверху:

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

Затем вы можете использовать функцию следующим образом:

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

Ответ 4

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