siva nagarjuna Ответов: 3

Пожалуйста, решите эту ошибку, выбор флажков MVC


Привет


Я работаю с флажками в MVC.У меня есть таблица с одним столбцом типа" бит".Следующий код дает мне ошибку

Что я уже пробовал:

[HttpPost]

 public string Index(IEnumerable<city> cities) 

{ 

if (cities.Count(x => x.Chosen) == 0)

 {

 return "You did not select any city"; 

}

Здесь выбран битный тип. и когда я пытаюсь построить это говорит "



Не может неявно преобразовать тип 'bool?' в 'bool'. Существует явное преобразование (вы пропускаете приведение?)

3 Ответов

Рейтинг:
1

Karthik_Mahalingam

Для nullable Типы использования Value собственность

if (cities.Count(x => x.Chosen.HasValue ? x.Chosen.Value :false) == 0)


Richard Deeming

То Value собственность бросит InvalidOperationException если значение равно null.

Karthik_Mahalingam

Нет, это не так

общественного класса MyClass
{
общественная bool? Выбранные { получить; набор; }
}

protected void Page_Load(отправитель объекта, EventArgs e)
{
Список<класса MyClass&ГТ; городов = новый список<класса MyClass&ГТ;();
города.Add (new MyClass () { Chosen = true });
города.Add (new MyClass () { Chosen = false });
города.Add (new MyClass () { Chosen = null });
Если (города.Граф (x = & gt; x.выбран.Свойство hasvalue ? х.Выбрали.Значение: false) = = 0)
{
}

}

Richard Deeming

Да, это так.

Код в вашем комментарии и во втором примере не имеет доступа к Value собственность, если это null Троичный оператор заботится об этом - хотя, вероятно, было бы чище использовать его x.GetValueOrDefault() вместо.

Но код в вашем первом примере делает это:

cities.Add(new MyClass { Chosen = null });
if (cities.Count(c => c.Chosen.Value) == 0)
...

Karthik_Mahalingam

Я согласен с этим " x. GetValueOrDefault()"
но код в комментарии работает нормально.
Пожалуйста, проверьте это.

тогда для чего используется свойство". HasValue"?

Richard Deeming

Да, как я уже сказал, код в вашем комментарии работает нормально.

Но первый пример в вашем первоначальном ответе не.

Если какой-либо город имеет свой Chosen свойство установлено в null, первый пример в вашем первоначальном ответе потерпит неудачу с InvalidOperationException.

Но я вижу, что теперь вы удалили этот пример. :)

Karthik_Mahalingam

Я полностью согласен с этим комментарием, то есть я поставил "с проверкой" и опубликовал 2-й пример.
однако сейчас я удалил первый пример, чтобы избежать хаоса в ОП.
:)
Забавная Драма :)

Karthik_Mahalingam

Я действительно удивлен вашим вопросом.

Richard Deeming

Почему? Что плохого в том, чтобы указать на потенциальное исключение из кода в решении?

Karthik_Mahalingam

с самого начала возникло недопонимание между примерами 1 и 2 :)
Игнорировать это

Рейтинг:
1

David_Wimbley

Ваша проблема заключается в том, что выбранное вами свойство класса city имеет тип bool? вместо була. типа bool? == nullable boolean в этом случае вы не можете использовать его так, как вы это делаете, из-за возможности того, что значение равно null.

Некоторые из ваших вариантов следующие.

// This option uses the null coalesing operator and the one i would suggest
if (cities.Count(m => m.Chosen ?? false) == 0)
{
                
}



//Direct comparison to true
if (cities.Count(m => m.Chosen == true) == 0)
{
                
}


//Long form version of the first example provided. Checking for HasValue first to prevent null comparison
if (cities.Count(m => m.Chosen.HasValue ? m.Chosen.Value : false) == 0)
{
                
}


Рейтинг:
0

Richard Deeming

В дополнение к решению 1, Вы не должны использовать Count если вы просто хотите определить, содержит ли последовательность какие-либо элементы, соответствующие условию. Воспользуйся Какой-нибудь[^] или Все[^] вместо:

if (!cities.Any(m => m.Chosen == true))
{
    ...
}

if (cities.All(m => m.Chosen != true))
{
    ...
}

То Any метод вернется, как только найдет элемент, соответствующий условию.
То All метод вернется, как только найдет элемент, который Не соответствуют условию.
То Count метод всегда должен будет перечислять всю входную последовательность.