2011-10-24 66 views
14

我正在使用MVVM創建一個對話框,它提示用戶輸入一個http://到KML文件的URL。當URL格式正確時,需要啓用「確定」按鈕,並且URL格式不正確時需要禁用該按鈕。讓用戶輸入格式正確的URL的最佳方式是什麼?

眼下按鈕被綁定到一個ICommand,以及CanExecute邏輯()看起來是這樣的:

return !string.IsNullOrEmpty(CustomUrl); 

命令的CanExecuteChanged事件引發的每次擊鍵,到目前爲止,它的工作好。

現在我想做一點實際驗證。我知道要做到這一點的唯一方法如下:

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

return true; 

這不是bueno,尤其是因爲驗證發生在每個按鍵上。我可以這樣做,以便在用戶點擊OK按鈕時驗證URI,但我寧願不要。有沒有更好的方法來驗證除捕獲異常之外的URI?

+1

對於每次按鍵運行一次驗證是絕對必要的嗎?單擊確定按鈕後,您是否可以不運行驗證? –

+0

我可以。但我希望用戶在移動鼠標並單擊按鈕之前知道該URL無效。 – Phil

+2

你可以使用['Uri.TryCreate'](http://msdn.microsoft.com/en-us/library/system.uri.trycreate.aspx)? –

回答

35

是 - 你可以使用靜態方法Uri.IsWellFormedUriString

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

恩,當天,每天都要學習新的東西。 – scottm

0

你可以使用Regex.IsMatch

而且,這裏有一個reliable pattern

\ B((我?) (:[AZ] [\ W - ] +:(:?[。]/{1,3} | | [A-Z0-9%])WWW \ d {0,3} | [A-z0- (?:[^ \ s()<>] + |(([^ \ s()<>] + |(([^ \ s()<>] + )))))+(?:(([^ \ s()<>] + |(([^ \ s()<>] +))))[[\\ s`! ] {<>?«»「」'']))

+1

聖牛。開發和測試這頭野獸需要多長時間? – Phil

+0

@Phil,大膽的火球網站上有很多關於它的信息。 – scottm

+0

@Phil:你見過[this](http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html)嗎? –

1

您可以將驗證規則添加到控件中,並且驗證將由「魔術」完成。

+0

您能否指出我關於ValidationRules的文章或文檔?我從來沒有用過它們。 – Phil

+0

您在這裏:[鏈接](http://www.codeproject.com/KB/WPF/wpfvalidation.aspx) – Fischermaen

+0

很酷。我認爲,用這種方法,我仍然需要找出一種檢測C#中的錯誤URI的好方法。但這仍然是一個漂亮的工具。 – Phil

7

可能的解決方案是兩個在我看來:

  • 創建一個正則表達式來檢查網址是否正確;
  • 使用Uri.TryCreate方法爲了避免異常(如果你不需要創建一個Uri對象,你可以使用Uri.IsWellFormedUriString方法);

我寧願使用第二個選項,創建正確的RegEx可能會很困難,並可能導致很多問題。

+2

沒有'Uri.TryParse'!也許你的意思是'Uri.TryCreate'? – Yahia

+0

更正,謝謝。 :) –

0

由於您已經連接到keystroke事件,因此您可以對字符串使用正則表達式驗證,然後由您決定將其標記爲無效還是完全不允許。這個post是相似的,並且有一個有效的URI的正則表達式。

相關問題