2011-03-23 33 views
8

Tôi có một trang ASP.NET khá đơn giản với một số trường nhập và trình xác nhận hợp lệ. Một lĩnh vực chấp nhận một ngoại hình đôi như thế này:ASP.NET RangeValidator weirdness với MaximumValue

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

này làm việc như mong đợi, và người dùng phải nhập một số lượng> = 0.
Cập nhật: điều này không làm việc như mong đợi sau tất cả (một số lỗi lạ Trong dự án). Xem ý kiến ​​để các câu trả lời dưới đây để biết chi tiết

Sau đó tôi cố gắng như nhau đối với một lĩnh vực chấp nhận một số nguyên:

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

Khi tải ASP-page, điều này mang lại cho tôi những lỗi sau: Giá trị ' Không thể chuyển đổi thuộc tính MaximumValue của 'vdGrossTonnage' thành loại 'Số nguyên'.

tôi không có bất kỳ yêu cầu giá trị tối đa cụ thể trong hệ thống, vì vậy tôi sẽ giống như nó là "mặc định" để Int32.MaxValue (mặc dù tôi sẽ phải nhập 2,147,483,647, vì MaximumValue dường như không chấp nhận Int32.MaxValue không đổi).

Tại sao số RangeValidator thuộc loại Integer sẽ không chấp nhận thuộc tính MaximumValue bị thiếu, nhưng đối với một trong các loại Double thì điều này có ổn không?

Trả lời

15

Các thuộc tính MinimumValueMaximumValue của RangeValidator trả về lớp string.Empty làm mặc định khi không được đặt.

Tiếp theo, cũng xảy ra phương pháp được bảo vệ Convert() được thực hiện bởi BaseCompareValidator, được sử dụng để chuyển đổi thuộc tính chuỗi thành giá trị, gọi int.Parse() cho trường hợp ValidationDataType.Integer. int.Parse() không thích chuỗi trống và sẽ ném một ngoại lệ.

Nhưng, trong trường hợp của ValidationDataType.Double, Convert() cuộc gọi đầu tiên một phương pháp bảo vệ, ConvertDouble() (thay vì double.Parse()), và trong phương pháp mà nó dứt khoát trả về một giá trị chuỗi "0" khi một chuỗi rỗng được phát hiện, và sau đó, giá trị chuỗi "0" phân tích cú pháp, thông qua double.Parse() thành 0d.

Trường hợp số nguyên không được hưởng lợi từ ánh xạ string.Empty đến "0".

Do đó, sự khác biệt. Ma quỷ là chi tiết, và Reflector là bạn của bạn.

+0

Chỉ cần theo dõi nhỏ: trong trường hợp tôi bỏ 'MaximumValue' cho loại kép, điều này thực sự có nghĩa là cả min và max là 0. Tại sao trang của tôi xác thực trường một cách chính xác (-1 không hợp lệ và 1 là hợp lệ (tôi đã kiểm tra kỹ và điều này thực sự hiệu quả))? – Nailuj

+0

@Nailuj Tôi không thể chứng thực cho phát hiện của bạn rằng trang xác thực chính xác với "1" làm đầu vào. Nếu tôi thả các điều khiển của bạn (từ đoạn đầu tiên của bạn ở trên) vào một trang mới trong một dự án trang web trống, nhập "1" và sau đó gây postback (tôi đã thêm một nút) * không * gây ra lỗi xác thực. –

+0

Nó không xác thực chính xác. –

0

Cách tốt nhất là chỉ định MaximumValue cho số RangeValidator ngay cả khi các yêu cầu của bạn không dành riêng cho một yêu cầu. Trong trường hợp đó, chỉ cần sử dụng MaxValue cho số Type. Giá trị mặc định cho MaximumValueString.Empty.

1

Để trống giá trị MaximumValue trên Type = "Double" tương đương với thiết lập MaximumValue thành 0. Tôi không chắc bạn có đúng về ví dụ đầu tiên của bạn làm việc tốt hay không.

+0

Có, tôi * * chắc chắn ví dụ đầu tiên hoạt động tốt. Tôi đã kiểm tra lại điều này (xem bình luận của tôi cho câu trả lời của Chris W. Rea). – Nailuj

+0

@Nailuj Tôi đã thử ví dụ của bạn và nó không hoạt động tốt. (Xem bình luận của tôi ở trên.) Bạn có thể thử lại trong trường hợp giảm thiểu đơn giản nhất có thể, bên ngoài ứng dụng của bạn, trong một dự án trang web mới, như tôi đã làm không? Có lẽ có mã khác từ ứng dụng của bạn đang can thiệp. ví dụ. Bạn có bật/tắt có chọn lọc bất kỳ trình xác thực nào của mình không? v.v. –

+0

@ Chris W. Rea: Tôi đã thử với một dự án ASP.NET mới, và trong trường hợp này tôi nhận được kết quả tương tự như bạn: xác nhận không * không * hoạt động tốt. Tôi không thể nghĩ về bất cứ điều gì rõ ràng trong ứng dụng khác của tôi mà có thể gây ra điều này hoặc là ... Nhưng nó không thực sự quan trọng, tôi sẽ chỉ đảm bảo xác định rõ ràng cả giá trị min và max. Cảm ơn đã dành thời gian để kiểm tra nó :) – Nailuj

0

Chỉ để làm cho nó khó hiểu hơn ..

Trong formview của tôi (đó là trong một updatepanel nếu mà làm cho bất kỳ sự khác biệt) Tôi có ..

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

Lưu ý độ và vĩ độ của tôi xác nhận là cơ bản giống trừ Longitude cho phép một maxvalue cao hơn.

Khi chạy, Kinh độ được xác nhận một cách chính xác như mong đợi - loại phải đạt được số và giá trị phải nằm giữa 0 và 180.

loại Latitude phải có dạng số, và nhiều thất bại nếu giá trị là tiêu cực, nhưng không phải là maxvalue đã kiểm tra. Tôi có thể đặt giá trị trong hàng triệu trong hộp văn bản và xác nhận không thất bại.