2011-10-24 11 views
14

Sto creando una finestra di dialogo utilizzando MVVM che richiede all'utente di digitare un URL http: // in un file KML. Il pulsante "OK" deve essere abilitato quando l'URL è nel formato corretto e deve essere disabilitato quando l'URL è in un formato non corretto.Il modo migliore per indurre un utente a inserire un URL correttamente formattato?

In questo momento il pulsante è associato a un ICommand, e la logica per CanExecute() si presenta così:

return !string.IsNullOrEmpty(CustomUrl); 

evento CanExecuteChanged del comando è sollevata su ogni battitura, e finora sta funzionando bene.

Ora voglio fare un po 'di convalida effettiva. L'unico modo che conosco per farlo è la seguente:

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

return true; 

Questo è senza bueno, soprattutto perché la convalida sta accadendo su ogni tasto. Potrei fare in modo che l'URI sia validato quando l'utente preme il pulsante OK, ma preferirei di no. C'è un modo migliore per convalidare l'URI oltre a rilevare le eccezioni?

+1

È assolutamente necessario eseguire la convalida una volta per ogni sequenza di tasti? Non puoi semplicemente eseguire la convalida quando fai clic sul pulsante OK? –

+0

Potrei. Ma mi piace che l'utente sappia che l'URL non è valido prima di spostare il mouse e fare clic sul pulsante. – Phil

+2

Puoi usare ['Uri.TryCreate'] (http://msdn.microsoft.com/en-us/library/system.uri.trycreate.aspx)? –

risposta

35

Sì - è possibile utilizzare il metodo statico Uri.IsWellFormedUriString per questo

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

Beh, dang, impara qualcosa di nuovo ogni giorno. – scottm

0

Si può semplicemente utilizzare Regex.IsMatch

Ed, ecco una 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

Mucca sacra. Quanto tempo ci è voluto per sviluppare e testare quella bestia? – Phil

+0

@Phil, ci sono molte informazioni sull'audace sito di fireball a riguardo. – scottm

+0

@Phil: hai visto [questo] (http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html)? –

1

È possibile aggiungere ValidationRules al controllo e validazione sarà fatto "per magia".

+0

Potrebbe indicarmi un articolo o una documentazione su ValidationRules? Non li ho mai usati. – Phil

+0

Eccoti: [link] (http://www.codeproject.com/KB/WPF/wpfvalidation.aspx) – Fischermaen

+0

Fresco. Penso che con questo approccio avrò ancora bisogno di trovare un buon modo per rilevare un URI errato in C#. Ma questo è ancora uno strumento ingegnoso. – Phil

7

soluzioni possibili sono due, a mio parere:

  • creare un'espressione regolare che controlla la correttezza URL;
  • Utilizzare il metodo Uri.TryCreate per evitare eccezioni (se non è necessario creare un oggetto Uri è possibile utilizzare il metodo Uri.IsWellFormedUriString);

Preferirei usare la seconda opzione, creare un RegEx corretto potrebbe essere difficile e potrebbe portare a molti problemi.

+2

Non c'è 'Uri.TryParse'! Forse intendi "Uri.TryCreate"? – Yahia

+0

corretto, grazie. :) –

0

Dato che si sta già eseguendo il collegamento con l'evento della sequenza di tasti, è possibile utilizzare la convalida dell'espressione regolare sulla stringa, quindi decidere se contrassegnarla come non valida o non consentirla del tutto. Questo post è simile e ha l'espressione regolare per un URI valido.

Problemi correlati