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 не проверяется. Я могу поместить значения в миллионы в текстовое поле, и проверка не завершится неудачей.