Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Защита от дурака, Проверка правильности вводимых данных 
:(
    Опции темы
myendlessness
Дата 15.7.2009, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 8.8.2008

Репутация: нет
Всего: нет



Предположим есть TextBox, в который вводится определённый адрес, в данном случае ftp, например: ftp.mail.ru!  В программе человек будет самостоятельно вводить адрес фтп-сервера, как сделать так чтобы была проверка на правильность введения, чтобы не было невнимательных ошибок и опечаток, что-то вроде: ftp2.mail.ru, ftp.mailru, ftpmail.ru, ftp.mail.ru.ru и прочих изобретательностей. Речь идёт о любом фтп-сервере. Как сделать такую защиту минимальными усилиями? Спасибо за помощь!
PM MAIL   Вверх
diadiavova
Дата 15.7.2009, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



В обработчиках событий Validating и Validated.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Heinzz
Дата 15.7.2009, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 12.12.2008
Где: .net

Репутация: 5
Всего: 9



разбить текст через Split используя разделитель '.' и проверить два условия:
 * первая строка =="ftp"
 * строк 3 шт

 * опционально - длина последней строки 2 символа


--------------------
user posted image
PM MAIL   Вверх
SKrivosein
Дата 16.7.2009, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007
Где: Praha - Прага

Репутация: 4
Всего: 8



Более-мение стандартное решение как написал diadiavova наставить CausesValidation TextBox-са на true которая
спустит событие Validating при уходе фокуса. Можно ещё добавить ErrorProvider который покажет пользователю чего плохо smile 
Код

void ftpTextBox_Validating(object sender, CancelEventArgs e)
{
       string error = null;               //необязательно
       Regex re = new Regex(@"^((ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3})$");   //если я правильно написал регулярное выражение?
       if(!re.IsMatch((TextBox)sender).text)
       {
              .....// код при неправильном вводе
              error = "чё за фигня...должно быть так: ftp.mail.ru!"          //необязательно
              e.Cancel  = true;
       }
       errorProvider.SetError((Control)sender, error);                //необязательно, нарисует иконку и текст обьяснялки.
}

void ftpTextBox_Validated(object sender, EventArgs e)
{
         ....//код если валидатинг прошел



Да regex возможно в этом случае : ^((ftp)\.[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3})$

Это сообщение отредактировал(а) SKrivosein - 16.7.2009, 01:23


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
myendlessness
Дата 16.7.2009, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 8.8.2008

Репутация: нет
Всего: нет



Ребята всем СПАСИБО за помощь smile  Ещё есть впрос по поводу Regex как правильно создавать эту строчку (^((ftp)\.[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3})$
), что означают символы? Где можно почитать? И ещё один момент, дело в том, что адрес сервера может состоять из разного количества слов, например: ftp.mail.ru, ftp.mail.tut.by и тд. Может стоит в цикле проверять каждое слово? или что-нибудь в этом духе, пока перевариваю и думаю как лучше и корректно сделать?!
PM MAIL   Вверх
diadiavova
Дата 16.7.2009, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Вообще-то проверить корректность адреса, а так же определить отдельные его параметры можно при помощи класса System.Uri
Код

bool IsCorrectFtpAddress(string addr)
{
    if(Uri.IsWellFormedUriString(addr, System.UriKind.Absolute)
    {
        var u = new Uri(addr);
        if(uri.Scheme == "ftp") return true;
    }
    return false;
}


Добавлено через 3 минуты и 29 секунд
А на счёт символов читай здесь
http://msdn.microsoft.com/ru-ru/library/sy...ions.regex.aspx
И далее по ссылкам в конце топика(другие ресурсы)


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
SKrivosein
Дата 16.7.2009, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007
Где: Praha - Прага

Репутация: 4
Всего: 8



Регулярные выражения беру как общий случай, допустим в техт бокс будеш вводить телефоны, е-майлы и т.д.
На книгу лови ссылку:Рег.выражения
Всегда пригодится.
P.S. полное выражение про URL: ^(http|https|ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~])*$ 

Это сообщение отредактировал(а) SKrivosein - 16.7.2009, 13:58


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
myendlessness
Дата 16.7.2009, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 8.8.2008

Репутация: нет
Всего: нет



diadiavova  спасибо за более оптимизированный подход, вот только дойду до 100 сообщений и сразу займусь Вашей репутацией smile   Запустил тот код, который Вы предложили, но не могу понять, ввожу и правильно и неправильно но IF выдаёт только false в чём может быть ошибка? 

Код

private void textBox1_Validating(object sender, CancelEventArgs e)
        {
            string error = null;
            ErrorProvider f = new ErrorProvider();
            if (!IsCorrectFtpAddress(textBox1.Text))
            {
                error = "Your adress is wrong!";
                e.Cancel = true;
            }
            f.SetError((Control)sender, error);   
      
        }

         public bool IsCorrectFtpAddress(string addr)
            {
              if(Uri.IsWellFormedUriString(addr, System.UriKind.Absolute))
                {
                  var u = new Uri(addr);
                  if(u.Scheme == "ftp") return true;
                }
                 return false;  <----- выдаёт всегда false
             }

PM MAIL   Вверх
diadiavova
Дата 16.7.2009, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Функция работает, надо смотреть другой код.
А в приведённом примере, как мне кажется, 10-строку надо тоже в блок if вставить. Объяснялку то в случае ошибки выводить надо. Или я чего-то не понял?

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  FTPCheck.rar 18,69 Kb


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
myendlessness
Дата 16.7.2009, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 8.8.2008

Репутация: нет
Всего: нет



2 SKrivosein 

Спасибо за книгу и помощь smile 
PM MAIL   Вверх
SKrivosein
Дата 16.7.2009, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007
Где: Praha - Прага

Репутация: 4
Всего: 8



А я если пишу ftp://mail.ru или например ftp://mail.test.ru то всё работает, а ftp.mail.ru нет.
Поэтому я свой первый регех написал так: ^((ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3})$
а потом исправил на: ^((ftp)\.[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3})$
и тот первый правильный, а второй... smile  хотя я незнаю все возможные URL

diadiavova if не надо, этот код f.SetError((Control)sender, error); выполнится всегда, но стаботает только если error !=null

Это сообщение отредактировал(а) SKrivosein - 16.7.2009, 15:20


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
myendlessness
Дата 16.7.2009, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 8.8.2008

Репутация: нет
Всего: нет



diadiavova Вы правильно заметили, что в строчке 10 нужен ещё if, просто у меня это пока пробная версия, тренериюсь и стараюсь понять как всё работает

понял почему у меня не срабатывало 
я пишу: ftp.mail.ru
Вы пишите: ftp://mail.ru

разница была в том, что нужно полностью (со слешем и двоеточием) писать адрес 

ВСЕМ СПАСИБО! You are  smile 

Хотел спросить, как сделать так, чтобы если открылось окно, то нельзя было переходить на другие окна?

Добавлено через 9 минут и 24 секунды
2 SKrivosein 

Вы меня чуть-чуть опередилиsmile 
Значит всё-таки в строчке 10 не надо if! 
PM MAIL   Вверх
SKrivosein
Дата 16.7.2009, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007
Где: Praha - Прага

Репутация: 4
Всего: 8



Form.ShowDialog(); ?
в 10 стрике ничего ненадо, смотреть выше.


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
myendlessness
Дата 16.7.2009, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 8.8.2008

Репутация: нет
Всего: нет



Тут возникает один вопрос, какой из двух способов Regex или IsCorrectFtpAddress будет обеспечивать лучшую защиту?
PM MAIL   Вверх
SKrivosein
Дата 16.7.2009, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007
Где: Praha - Прага

Репутация: 4
Всего: 8



Всмысле лучшую? Если напишеш правильно рег.выражение то номоему всёравно. Регулярные выражения более универсальны, допустим тебе банк скажет что необходимо проверить вот такого вида ввод: 1234-7746043/asd-0300, здесь нечего стандартного найти нельзя надо самому писать выражение. А IsCorrectFtpAddress это встроеный в .NET метод он 99,99% правильный и голову ламать не надо, но надо знать что он есть  smile 


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1065 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.