На моем сайте есть функция поиска, и один из вариантов, который есть у пользователя, — это выбрать тип поиска.
Итак, учитывая этот пример в представлении:
@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 в качестве модели вместо объекта не является оптимальным, но генерируемые таблицы данных различаются в зависимости от типа поиска, поэтому я застрял на этом.





Чтобы расширить ответ @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 для сопоставления выражения с шаблоном, указанным в разделе Объявление и шаблоны типов:
Когда шаблон объявления соответствует выражению, этой переменной присваивается преобразованный результат выражения.
О, это даже лучше, потому что у меня их несколько на одной странице, и мне было интересно, нужно ли мне создавать новую строковую переменную для каждого из них. Спасибо!