2011-10-24 25 views
14

Tôi đang tạo một hộp thoại bằng cách sử dụng MVVM để nhắc người dùng nhập URL http: // vào tệp KML. Nút "OK" cần được bật khi URL ở định dạng chính xác và cần phải tắt nút này khi URL ở định dạng không chính xác.Cách tốt nhất để người dùng nhập URL được định dạng chính xác?

Ngay bây giờ nút được liên kết với một ICommand, và logic cho CanExecute() trông như thế này:

return !string.IsNullOrEmpty(CustomUrl); 

kiện CanExecuteChanged của lệnh được nâng lên trên tất cả các tổ hợp phím, và cho đến nay nó hoạt động tốt.

Bây giờ tôi muốn thực hiện một chút xác thực thực tế. Cách duy nhất tôi biết để thực hiện điều đó là như sau:

try 
{ 
    var uri = new Uri(CustomUrl); 
} 
catch (UriFormatException) 
{ 
    return false; 
} 

return true; 

Đó không phải là bueno, đặc biệt là khi xác thực đang diễn ra trên mỗi lần nhấn phím. Tôi có thể làm cho nó để URI được xác nhận khi người dùng nhấn nút OK, nhưng tôi không muốn. Có cách nào tốt hơn để xác nhận URI ngoài việc bắt ngoại lệ?

+1

Bạn có bắt buộc phải chạy xác thực một lần cho mọi lần nhấn phím không? Bạn có thể không chỉ chạy xác thực khi nhấn nút OK? –

+0

Tôi có thể. Nhưng tôi thích người dùng biết rằng URL không hợp lệ trước khi di chuyển chuột và nhấp vào nút. – Phil

+2

Bạn có thể sử dụng ['Uri.TryCreate'] (http://msdn.microsoft.com/en-us/library/system.uri.trycreate.aspx) không? –

Trả lời

35

Có - bạn có thể sử dụng phương pháp tĩnh Uri.IsWellFormedUriString cho điều này

return Uri.IsWellFormedUriString (CustomUrl, UriKind.Absolute); 
+4

Vâng, dang, học một cái gì đó mới mỗi ngày. – scottm

0

Bạn chỉ có thể sử dụng Regex.IsMatch

Và, đây là một reliable pattern:

\ b ((i?) (?: [az] [\ w -] +: (?:/{1,3} | [a-z0-9%]) | www \ d {0,3} [.] | [a-z0- 9 .-] + [.] [Az] {2,4} /) (?: [^ \ S() <>] + | (([^ \ s() <>] + | (([^ \ s() <>] +))) )) + (?: (([^ \ S() <>] + | (([^ \ s() <>] +)))) | [^ \ s`!() [) [ ] {} ;: '"., <>?« »“ ”' ']))

+1

Bò thánh. Mất bao lâu để phát triển và kiểm tra con thú đó? – Phil

+0

@Phil, Có rất nhiều thông tin trên trang web quả cầu lửa táo bạo về nó. – scottm

+0

@Phil: Bạn đã xem [this] (http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html) chưa? –

1

Bạn có thể thêm ValidationRules vào kiểm soát và xác thực sẽ được thực hiện" bằng phép thuật ".

+0

Bạn có thể chỉ cho tôi một bài viết hoặc tài liệu về ValidationRules không? Tôi chưa bao giờ sử dụng chúng. – Phil

+0

Đây là: [link] (http://www.codeproject.com/KB/WPF/wpfvalidation.aspx) – Fischermaen

+0

Cool. Tôi nghĩ rằng với cách tiếp cận này, tôi vẫn sẽ cần phải tìm ra một cách tốt để phát hiện một URI xấu trong C#. Nhưng đây vẫn là một công cụ tiện lợi. – Phil

7

giải pháp có thể là hai trong quan điểm của tôi:

  • Tạo một biểu thức chính quy để kiểm tra tính đúng đắn URL;
  • Sử dụng phương thức Uri.TryCreate để tránh ngoại lệ (nếu bạn không cần tạo đối tượng Uri, bạn có thể sử dụng phương thức Uri.IsWellFormedUriString);

Tôi muốn sử dụng tùy chọn thứ hai, tạo RegEx chính xác có thể khó và có thể dẫn đến nhiều sự cố.

+2

Không có 'Uri.TryParse'! Có lẽ bạn có nghĩa là 'Uri.TryCreate'? – Yahia

+0

Đã sửa, cảm ơn. :) –

0

Vì bạn đã hooking vào sự kiện tổ hợp phím, bạn có thể sử dụng xác nhận biểu thức chính quy trên chuỗi, sau đó tùy thuộc vào bạn có gắn cờ nó là không hợp lệ hoặc không cho phép nó. Điều này post là tương tự và có biểu thức chính quy cho một URI hợp lệ.

Các vấn đề liên quan