Возможно ли использовать условный оператор без присвоения результата?

#c# #asp.net-mvc #asp.net-core

#c# #asp.net-mvc #asp.net-core

Вопрос:

У меня есть ASP.Net Основной вид, и в нем я пытаюсь уменьшить отображаемый текст, я мог бы использовать:

 @if (item.Details.Length < 100)
{
     <span>@item.Details</span>
}
else
{
    <span>@item.Details.Substring(0, 99) ...</span>
}
  

Но потом я подумал, что мог бы использовать условный оператор:

 <span>@{item.Details.Length < 100 ? item.Details : item.Details.Substring(0, 99);}</span>
  

Я предполагаю, что это не работает по той же причине, по которой это не работает:

 @if (item.Details.Length < 100)
{
    item.Details;
}
else
{
    item.Details.Substring(0, 99);
}
  

т. е. синтаксис должен быть разбит на html и cs части, но есть ли какой-либо синтаксис, который я могу использовать для присвоения и отображения переменной в однострочном формате с использованием условного оператора?

Пожалуйста, не говорите мне, что вся логика отображения должна выполняться в ViewModel. Я знаю, что это может быть лучшим вариантом, но это не то, о чем я спрашиваю!

Комментарии:

1. Я бы ожидал, что это сработает, если вы просто удалите ; — то, что у вас есть, не является допустимым утверждением , но это допустимое выражение . Как всегда, было бы действительно полезно, если бы вы включили точное сообщение об ошибке, которое вы получаете, вместо того, чтобы заставлять нас гадать.

2. Привет @JonSkeet он не компилируется, если я исключаю ; он сообщает мне, что это ожидаемо. Когда я добавляю ; , это дает мне Only assignment, call ... expressions can be used as a statement.

3. Ах, возможно, причиной проблемы является использование {} . Как насчет @(item.Details.Length < 100 ? item.Details : item.Details.Substring(0, 99)) ?

4. Я только что попробовал, что я действительно могу объявить строку x в строке, а затем поместить ее между <element> тегами — я не знал, что это возможно до сих пор

5. Ах, вот оно что! Использование () вместо {} — сработало как по волшебству. Я знал, что делал это раньше! () Вычисляют выражение, тогда как {} — это скорее блок кода?

Ответ №1:

В настоящее время вы пытаетесь использовать условное ?: выражение как оператор — но это не выражение оператора. Однако это является допустимым выражением само по себе. Итак, вам нужно:

  • Удалить ; , который действителен только после инструкции
  • Измените {} (используется для тела блока) на () (используется для указания Razor, какой объем текста составляет выражение)
 <span>@(item.Details.Length < 100 ? item.Details : item.Details.Substring(0, 99))</span>
  

Обратите внимание, что в C # 8 вы можете использовать оператор range для большей краткости:

 <span>@(item.Details.Length < 100 ? item.Details : item.Details[..99])</span>