Условное не работает в представлении ASP.NET Core 7 Razor

На моем сайте есть функция поиска, и один из вариантов, который есть у пользователя, — это выбрать тип поиска.

Итак, учитывая этот пример в представлении:

@using System.Data
@model DataSet

hello, world
<br />
@ViewData["searchtype"]

@if (ViewData["searchtype"] == "rank")
{
    <h2>Ranks</h2>
    <ol>
        @foreach (DataRow dr in Model.Tables[0].Rows)
        {
            <li>@dr["name"].ToString()</li>
        }
    </ol>
}

Я ожидаю, что он либо даст мне заголовок Ranks сам по себе (если таблица данных пуста), либо пронумерованный список рангов, следующий за этим заголовком.

Вместо этого я получаю следующее:

hello, world
rank

Так что я знаю, что дело доходит до просмотра. И я знаю, что он способен видеть ценность ViewData["searchtype"]. А вот условное, которое должно быть оценено как истинное, таковым не является.

И я знаю, что очевидный ответ — заменить ViewData["searchtype"] на ViewData["searchtype"].ToString(), но когда я это делаю, я буквально ничего не получаю. Ни «привет, мир», ни «ранг», ни «Ранг», а также ничего со страницы _Layout. Просто чистый пустой браузер.

Кроме того, я знаю, что использование DataSet в качестве модели вместо объекта не является оптимальным, но генерируемые таблицы данных различаются в зависимости от типа поиска, поэтому я застрял на этом.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы расширить ответ @Jackdaw, документация Microsoft по сопоставлению шаблонов для списков операторов is:

C# поддерживает несколько шаблонов, включая объявление, тип, константу, реляционный, свойство, список, переменную и отбрасывание.

В разделе Постоянный шаблон:

Шаблон констант используется для проверки того, равен ли результат выражения указанной константе. ... вы можете использовать любое постоянное выражение, например... числовой литерал integer или floating-point, литерал string, логическое значение true или false, ...

В своем сообщении вы сравниваете строковый литерал "rack", поэтому вы можете установить условие if:

@if (ViewData["searchtype"] is "rank")
{
    ...
}

Как подчеркивается в комментариях (см. комментарий @ProgrammingLlama) и ответе (от @Akade) в этом SO-посте, убедитесь, что используется литерал string, а не переменная string.

Если ключ «тип поиска» отсутствует в словаре ViewData или ключ находится в словаре, но его значение явно установлено в null, или пара ключ/значение «тип поиска» является каким-либо другим значением, то условие if выше оценивается как false .

В ответе @Jackdaw используется оператор is для сопоставления выражения с шаблоном, указанным в разделе Объявление и шаблоны типов:

Когда шаблон объявления соответствует выражению, этой переменной присваивается преобразованный результат выражения.

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

Lisa 07.07.2024 12:31

Другие вопросы по теме