Лучший способ заставить пользователя ввести правильно отформатированный URL-адрес?

Я создаю диалог с использованием MVVM, который предлагает пользователю ввести URL http://в файл KML. Кнопка "ОК" должна быть включена, когда URL-адрес находится в правильном формате, и его необходимо отключить, если URL-адрес находится в неправильном формате.

Прямо сейчас кнопка привязана к ICommand, и логика CanExecute() выглядит так:

return !string.IsNullOrEmpty(CustomUrl);

Команда CanExecuteChanged добавляется к каждому нажатию клавиши, и пока она хорошо работает.

Теперь я хочу сделать немного фактической проверки. Единственный способ, которым я это знаю, заключается в следующем:

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

return true;

Это не bueno, тем более, что валидация происходит при каждом нажатии клавиши. Я мог бы сделать так, чтобы URI был проверен, когда пользователь нажимает кнопку "ОК", но я бы предпочел. Есть ли лучший способ проверить URI, кроме исключения исключений?

Ответы

Ответ 1

Да - вы можете использовать статический метод Uri.IsWellFormedUriString для этого

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

Ответ 2

Возможные решения, по моему мнению, два:

  • Создайте регулярное выражение, которое проверяет правильность URL-адреса;
  • Используйте метод Uri.TryCreate, чтобы избежать исключений (если вам не нужно создавать объект Uri, вы можете использовать метод Uri.IsWellFormedUriString);

Я бы предпочел использовать второй вариант, создание правильного RegEx может быть трудным и может привести к множеству проблем.

Ответ 3

Вы можете добавить ValidationRules в элемент управления, и проверка будет выполнена "по волшебству".

Ответ 4

Вы можете просто использовать Regex.IsMatch

И здесь надежный шаблон:

\ Ь ((: [AZ] [\ ш -] +: (: (я?)?/{1,3} | [а-z0-9%]) | WWW\д {0,3 } | [а-z0-9.-] + [AZ] {2,4}/): [< > (^\s (+ | (([^\s ([.] [.]?)] ) < > ] + | (([^\s() < > ] +))))) + ((([^\s() < > ] + | (([^\s (? ) < | ' ".?, < > "" ""' > ] +)))) [! ^\s`() [] {};:]))

Ответ 5

Поскольку вы уже подключаетесь к событию нажатия клавиши, вы можете использовать проверку правильности выражения в строке, тогда вам решать, следует ли ее помечать как недопустимое или вообще не разрешать. Этот пост похож и имеет регулярное выражение для допустимого URI.