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