Странность ASP.NET RangeValidator с MaximumValue - PullRequest
9 голосов
/ 23 марта 2011

У меня есть довольно простая страница 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.
Обновление: это делаетне работает, как ожидалось, в конце концов (какая-то странная ошибка в проекте).Подробности см. В комментариях к ответам ниже.

Затем я пытаюсь сделать то же самое для поля, принимающего целое число:

<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 ]

15 голосов
/ 23 марта 2011

Свойства 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".

Отсюда и расхождение. Дьявол кроется в деталях, и Отражатель - твой друг.

1 голос
/ 23 марта 2011

Оставить пустое поле MaximumValue для Type = "Double" эквивалентно установке MaximumValue в 0. Я не уверен, что вы правы насчет первого из ваших примеров, работающих нормально.

0 голосов
/ 16 октября 2014

Просто, чтобы сделать это более запутанным ..

В моем виде (который находится в панели обновления, если это имеет какое-либо значение) у меня есть ..

<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>

Обратите внимание на мою широту и долготупроверка в основном такая же, за исключением того, что Longitude допускает более высокое максимальное значение.

При работе Longitude проверяется точно так, как ожидается - тип должен быть числовым, а значение должно быть в диапазоне от 0 до 180.

Тип широты долженбыть числовым, и диапазон завершается ошибкой, если значение отрицательное, но максимальное значение не проверяется.Я могу поместить значения в миллионах в текстовое поле, и проверка не завершится неудачей.

0 голосов
/ 23 марта 2011

Рекомендуется указывать MaximumValue для RangeValidator, даже если ваши требования не требуют его указания.В этом случае просто используйте MaxValue для Type.Значение по умолчанию для MaximumValue равно String.Empty.

...