ASP.NET странность RangeValidator с максимальным значением
у меня довольно простой ASP.NET страница с некоторыми полями ввода и валидаторами. Одно поле, принимающее двойник, выглядит так:
<asp:TextBox ID="tbHeight" runat="server" />
<asp:RangeValidator ID="vdHeight" runat="server"
ErrorMessage="Height must be a positive number" Text="*"
ControlToValidate="tbHeight" MinimumValue="0" Type="Double" />
это работает, как ожидалось, и пользователь должен ввести число >= 0.
Update: это не работает так, как ожидалось после (какая-то странная ошибка в проекте). См. комментарии к ответам ниже для деталей
затем я попробую то же самое для поля, принимающего целое число:
<asp:TextBox ID="tbGrossTonnage" runat="server" />
<asp:RangeValidator ID="vdGrossTonnage" runat="server"
ErrorMessage="Gross Tonnage must be a positive whole number" Text="*"
ControlToValidate="tbGrossTonnage" MinimumValue="0" Type="Integer" />
при загрузке ASP-страницы это дает мне следующую ошибку:значение "свойства MaximumValue' vdGrossTonnage 'не может быть преобразовано в тип 'Integer'.
у меня нет конкретных требований к максимальному значению в системе, поэтому я просто хотел бы, чтобы "по умолчанию"Int32.MaxValue
(хотя мне пришлось бы ввести 2,147,483,647, так как MaximumValue
похоже, не принимает Int32.MaxValue
константы).
почему RangeValidator
типа Integer
не хватает MaximumValue
свойство, но для одного из типов Double
это нормально?
4 ответов
на MinimumValue
и MaximumValue
свойства RangeValidator
классе string.Empty
как их по умолчанию, когда не задан.
далее, также случается, что Convert()
защищенный метод реализован BaseCompareValidator
, который используется для преобразования строковых свойств до значений, называет int.Parse()
на ValidationDataType.Integer
случае. int.Parse()
не нравится пустая строка и будет выдавать исключение.
но, в случае ValidationDataType.Double
, Convert()
сначала вызывает другой защищенный метод, ConvertDouble()
(вместо double.Parse()
), и в том методе это явно возвращает строковое значение " 0 " при обнаружении пустой строки, и это строковое значение " 0 " позже анализирует через double.Parse()
на 0d
.
целочисленный случай не выигрывает от такого отображения string.Empty
к "0".
следовательно, dicrepancy. Дьявол кроется в деталях, и отражатель - твой друг.
оставляя MaximumValue пустым на Type= "Double" эквивалентно установке MaximumValue в 0. Я не уверен, что вы правы в том, что первый из ваших примеров работает нормально.
лучше всего указать MaximumValue
на RangeValidator
даже если ваши требования специально не требуют одного. В этом случае просто используйте MaxValue
на Type
. Значение по умолчанию для MaximumValue
is String.Empty
.
просто, чтобы сделать его более запутанным..
в моем formview (который находится в updatepanel, если это имеет значение) у меня есть..
<div class="Width100PercentPadded">
<div class="Width40PercentPadded FloatLeft ClearLeft">
Latitude:
</div>
<div class="Width60PercentPadded FloatLeft">
<asp:TextBox runat="server" ID="txtLatitude" CssClass="Width100Percent" Text='<%# Bind("Latitude") %>' ></asp:TextBox>
<asp:CompareValidator ID="CompareValidatorLatitude" runat="server" ControlToValidate="txtLatitude" Operator="DataTypeCheck" Type="Double" ErrorMessage="Latitude must be numeric" Text="must be numeric" ForeColor="Red" Display="Dynamic"></asp:CompareValidator>
<asp:RangeValidator ID="RangeValidatorLatitude" runat="server" ControlToValidate="txtLatitude" MinimumValue="0" MaximumValue="90" ErrorMessage="Latitude in range 0 to 90" Text="range 0 to 90" ForeColor="Red" Display="Dynamic"></asp:RangeValidator>
</div>
</div>
<div class="Width100PercentPadded">
<div class="Width40PercentPadded FloatLeft ClearLeft">
Longitude:
</div>
<div class="Width60PercentPadded FloatLeft">
<asp:TextBox runat="server" ID="txtLongitude" CssClass="Width100Percent" Text='<%# Bind("Longitude") %>'></asp:TextBox>
<asp:CompareValidator ID="CompareValidatorLongitude" runat="server" ControlToValidate="txtLongitude" Operator="DataTypeCheck" Type="Double" ErrorMessage="Longitude must be numeric" Text="must be numeric" ForeColor="Red" Display="Dynamic"></asp:CompareValidator>
<asp:RangeValidator ID="RangeValidatorLongitude" runat="server" ControlToValidate="txtLongitude" MinimumValue="0" MaximumValue="180" ErrorMessage="Longitude in range 0 to 180" Text="range 0 to 180" ForeColor="Red" Display="Dynamic"></asp:RangeValidator>
</div>
</div>
обратите внимание, что моя проверка широты и долготы по существу одинакова, за исключением долготы, допускающей более высокое значение maxvalue.
при запуске долгота проверяется точно так, как ожидалось - тип должен быть числовым, а значение-от 0 до 180.
тип широты должен быть числовым, а диапазон терпит неудачу, если значение отрицательное, но maxvalue не проверяется. Я могу поместить значения в миллионы в текстовое поле, и проверка не завершится неудачей.