Сравнение троичных строк в режиме Razor не работает

#asp.net-core #razor-pages

#asp.net-core #razor-страницы

Вопрос:

У меня есть режим Razor, в котором я пытаюсь применить троичный параметр, чтобы элемент в поле выбора отображался как выбранный. По какой-то причине сравнение строк в ternary, похоже, не работает, даже если значение строки в модели соответствует строке, с которой я сравниваю.

Вот что я пытаюсь сделать;

 <select name="accountStatus" class="form-control w-100">
<option>Any</option>
<option value="ACTIVE" @(Model.AccountStatus == "ACTIVE" ? "selected" : "")>Active only</option>
<option value="INACTIVE" @(Model.AccountStatus == "INACTIVE" ? "selected" : "")>Inactive only</option>
</select>
  

Я подтвердил, что значение Model .AccountStatus ‘АКТИВЕН’, но для выбора по умолчанию используется значение ‘Any’.

Я вывел значение AccountStatus на странице, чтобы подтвердить, что оно действительно используется правильно.

Что я делаю не так?

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

1. Вы подтвердили, что оно «АКТИВНОЕ», а не «АКТИВНОЕ» или «Активный» правильно? Вы также могли бы создать модель. AccountStatus. Равно («АКТИВНЫЙ», сравнение строк. OrdinalIgnoreCase), чтобы избежать каких-либо проблем с корпусом. Или даже вызовите Trim() перед выполнением сравнения. Я действительно не думаю, что это троичное, но проблема с самим сравнением строк и данными, возможно, не получается точно так, как мы думаем (например, легко пропустить пробел в конце)

2. Да, я подтвердил, что значение ‘ACTIVE’, все заглавные буквы, нигде в строке нет пробелов. Я попробовал ваше предложение, это не сработало. Однако я переключился на использование списка выбора вместо этого, и это работает.

Ответ №1:

Возвращайте null из вашей троичной строки вместо пустой строки. Если значение атрибута равно null, Razor автоматически удалит его, но поскольку вы устанавливаете для него значение something, даже если это просто пустая строка, оно сохранится.

Вы могли бы изменить свой код на:

 <select name="accountStatus" class="form-control w-100">
<option>Any</option>
<option value="ACTIVE" selected="@((Model.AccountStatus =="ACTIVE") ? "selected" : null )">Active only</option>
<option value="INACTIVE" selected="@((Model.AccountStatus =="INACTIVE") ? "selected" : null )">Inactive only</option>
</select>