Лучший способ заставить пользователя ввести правильно отформатированный URL? - PullRequest
14 голосов
/ 24 октября 2011

Я создаю диалог с использованием 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;

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

Ответы [ 5 ]

35 голосов
/ 24 октября 2011

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

return Uri.IsWellFormedUriString (CustomUrl, UriKind.Absolute);
7 голосов
/ 24 октября 2011

На мой взгляд, возможны два решения:

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

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

1 голос
/ 24 октября 2011

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

0 голосов
/ 24 октября 2011

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

0 голосов
/ 24 октября 2011

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

И вот вам надежный шаблон :

(? I) \ b((: [AZ] [\ ш -] +: (?:? [.] / {1,3} | | [а-z0-9%]) WWW \ д {0,3} | [а-г0-9 .-] + [] [AZ] {2,4} /): <>] + | (([^ \ (ы) <>] + | (([^. ([^ \ с (?)\ s () <>] +))) )) + (: (([^ \ s () <>] + | (([^ \ s (?) <>] +))) ) | [^ \ s`! () [] {} ;: '"., <>?« »« ”' ']))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...