让用户输入格式正确的URL的最佳方法是什么?

时间:2011-10-24 19:41:27

标签: c# .net wpf user-interface validation

我正在使用MVVM创建一个对话框,提示用户输入一个http:// URL到KML文件。当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吗?

5 个答案:

答案 0 :(得分:35)

是 - 您可以将静态方法Uri.IsWellFormedUriString用于此

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

答案 1 :(得分:7)

在我看来,可能的解决方案是两个:

  • 创建一个检查网址正确性的正则表达式;
  • 使用Uri.TryCreate方法以避免异常(如果您不需要创建Uri对象,则可以使用Uri.IsWellFormedUriString方法);

我更愿意使用第二种选择,创建正确的RegEx可能很困难并且可能导致许多问题。

答案 2 :(得分:1)

您可以将ValidationRules添加到控件中,验证将“通过魔法”完成。

答案 3 :(得分:0)

您可以使用Regex.IsMatch

而且,这是一个reliable pattern

  

\ B((:[AZ] [\ W - ] +:(:(Ⅰ')?/ {1,3} | [A-Z0-9%])| WWW \ d {0,3 } | [A-Z0-9 .-] + [AZ] {2,4} /):[<>(^ \ S(+ |(([^ \ S [] [])〕 ()<>] + |(([^ \ S()<>] +)))))+(?:(([^ \ S()<>] + | (([^ \ S()<>] +))))| [^ \ s`()[] {} ;:'!”,<&GT ;?«»‘’ '']))

答案 4 :(得分:0)

由于您已经挂钩击键事件,您可以对字符串使用正则表达式验证,然后由您决定是将其标记为无效还是根本不允许它。此post类似,并且具有有效URI的正则表达式。