如何最好地让用户输入格式正确的URL?

14

我正在使用MVVM创建一个对话框,提示用户输入指向KML文件的http:// URL。当URL格式正确时,“确定”按钮需要启用,而当URL格式不正确时,它需要被禁用。

现在,该按钮绑定到一个ICommand,CanExecute()方法的逻辑如下:

return !string.IsNullOrEmpty(CustomUrl);

命令的CanExecuteChanged事件在每次按键时都会被触发,目前它运行良好。

现在我想进行一些实际的验证。我所知道的唯一方法是如下所示:

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

return true;

这不太好,特别是因为每次按键时都会进行验证。我可以使URI在用户点击“OK”按钮时验证,但我不想这样做。有没有比捕获异常更好的验证URI的方法?


1
你是否一定要在每次按键时运行验证?难道你不能只在单击“确定”按钮时运行验证吗? - Kiley Naro
我可以这样做。但是我喜欢让用户在移动鼠标并点击按钮之前就知道URL无效。 - Phil
2
你可以使用Uri.TryCreate吗? - George Duckett
1
那么,为什么不设置一个计时器来检查用户是否完成了输入,而不是每次都检查每个按键呢?比如说,设置一个300毫秒的计时器,当用户完成输入后再运行验证。这样,如果他们连续按下多个按键,你就不必在每个按键上运行验证,而只需在他们暂停时立即运行一次验证即可。 - Kiley Naro
我考虑过这个问题,但是多线程用户输入/验证可能会变得有些棘手。就像用锤子打苍蝇一样。 - Phil
5个回答

35

是的 - 您可以使用静态方法Uri.IsWellFormedUriString 来实现此功能。

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

7

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

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

我更倾向于使用第二个选项,创建正确的正则表达式可能会很困难,并且可能会导致许多问题。


2
没有 Uri.TryParse!也许你想说的是 Uri.TryCreate - Yahia

1

您可以向控件添加ValidationRules,验证将会“神奇”地完成。


你能给我指一篇关于ValidationRules的文章或文档吗?我从未使用过它们。 - Phil
很酷。我认为使用这种方法,我仍然需要找出一种在C#中检测坏URI的好方法。但是这仍然是一个不错的工具。 - Phil
@Phil:是的,你仍然需要验证值,但你不需要每次按键都进行验证。WPF会处理验证的需求,但验证仍然是你的工作。我的回答是根据你问题的最后一部分而来的。 - Fischermaen

0
你可以直接使用 Regex.IsMatch
此外,这是一个可靠的模式

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


1
天啊,开发和测试那个东西花了多长时间? - Phil
@Phil,有关此事,Daring Fireball 网站上有很多信息。 - scottm
@Phil:你看过这个了吗? - H.B.

0

既然您已经钩入了按键事件,那么您可以在字符串上使用正则表达式验证,然后由您决定是否将其标记为无效或根本不允许。这个post类似,并具有有效URI的正则表达式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接