Приведение Eval(bitValue) к типу Bool

У меня есть представление списка с элементом управления HyperLink в ItemTemplate. Я хочу отображать ссылку, если возвращаемое значение равно 0 (ложь), и не отображать ссылку, если она равна 1 (истина).

Пока у меня это:

<asp:HyperLink runat="server" ID="lnkReview"
  NavigateUrl='<%# Eval("EnquiryID", @"selectcompany.aspx?enq={0}")%>'
  Text="Review Enquiry"
  Visible='<%# ((bool)Eval("Locked"))==true? false : true %>' />

... но это создает исключение «Указанное приведение недействительно».

Примеры, которые я видел в других местах, предполагают, что это должно работать. Я могу подтвердить, что столбец Locked возвращает только 0 или 1 (из SQL Server) - конечно, их нужно легко преобразовать из bit/int в bool??


person CJM    schedule 11.08.2010    source источник


Ответы (3)


Если Locked является int, вы должны сделать это:

<%# ((int)Eval("Locked")) == 1 ? true : false %>

Но тогда это тоже должно работать, поэтому оно возвращает true, когда Locked> 0

<%# !((int)Eval("Locked") == 0) %>

Независимо от того, упоминается ли, что Locked содержит 0 или 1. Это все еще INT, который по какой-то причине может содержать значения > 1. Поэтому я считаю хорошей практикой выполнять проверьте == 0 вместо == 1. Мы не знаем, для чего используется Locked, и в будущем дизайн может измениться, чтобы Locked могло содержать значение > 1.

person Jeroen    schedule 11.08.2010
comment
((int)Eval("Locked")) == 1 достаточно. - person leppie; 11.08.2010
comment
Я могу поклясться, что действительно пробовал это. Запутанная часть заключается в том, что поле на самом деле немного и, следовательно, не может быть > 1, поэтому я ожидал, что смогу преобразовать его в логическое значение. Тем не менее, обработка его как int работает, и это важно! Спасибо. - person CJM; 12.08.2010
comment
@leppie - ((int)Eval("Locked"))!=! - кажется, никто не заметил, логика была обратной ... но точка зрения принята .. :) - person CJM; 12.08.2010
comment
Это решение не работает для меня. Почему это работает для всех остальных? У меня возникли проблемы с выяснением, началась ли операция с int или бита в базе данных. Я начинаю с немного. - person Joe Phillips; 12.08.2010
comment
В итоге мое решение выглядело так: <%# ((bool)Eval("default")) == false %> - person Joe Phillips; 12.08.2010
comment
проверьте это stackoverflow.com/questions/19182859/ - person reza akhlaghi; 17.02.2015
comment
Я все еще получаю сообщение «Указанный состав недействителен». - person Greg Quinn; 25.10.2016

SQL — странный мир, где биты могут иметь три состояния: 0, 1 и null! Таким образом, это означает, что Eval("Locked") является типом bool, допускающим значение NULL, а не обычным bool. Приведение к bool не будет допустимым, если значение бита равно null, вы должны сначала проверить это:

(Eval("Locked")!=null && (bool)Eval("Locked")==true)

Это предполагает, что значение null должно быть сопоставлено с значением false.

person Gnomo    schedule 11.08.2010
comment
Уверены ли вы? Не должно быть проблем с преобразованием bool? в bool, если нет нулевых значений (что подтверждено OP). - person Gabe; 11.08.2010
comment
Забыв о проблеме с нулевыми значениями, ваше решение не будет работать, потому что оно не позволит по какой-то неизвестной причине использовать бит как логическое значение... - person CJM; 12.08.2010

person    schedule
comment
Это единственный метод, который мне помог, большое спасибо! - person Denys Avilov; 04.04.2016
comment
Да, также есть исключение при использовании null вместо DBNull.Value. - person eddy white; 09.11.2017