Например нужно проверить что пароль имеет длину >8 символов, а также в нем нет каких-то специфических символов, а также последовательность символов не совпадает с последовательностью клавиш на клавиатуре, содержит обязательно цифру и символы разного регистра.
В общем случае это должен быть некий метод bool IsValid( string value ) который реализует алгоритм проверки.
Сейчас приходится реализовывать метод IsValid как на клиенте ( javascript ), так и на сервере ( метод веб-сервиса ).
Проблема очевидна — дублирование кода. Если меняется логика проверки, то ее нужно менять в нескольких местах.
Как вариант вижу решение использовать на сервере javascript который реализует IsValid и запускать выполнение этого скрипта также на сервере ( пока точно не знаю как, но технически это по идее возможно ).
Может есть более элегантные и быстродействующие способы ?
Здравствуйте, vbarhatov, Вы писали:
V>Здравствуйте, Аноним, Вы писали:
А>>Например нужно проверить что пароль имеет длину >8 символов, а также в нем нет каких-то специфических символов, а также последовательность символов не совпадает с последовательностью клавиш на клавиатуре, содержит обязательнои цифру и символы разного регистра....
V>Столкнулся сейчас с точно такой же задачей. Пока реализовано так же, как у Вас.
V>Сейчас прикинул... А если отделить логику от кода, и скажем, записать все условия отдельно в xml? Можно использовать регулярные выражения.
V>На крайний случай, если у нас есть несколько регулярных выражений, то скрипт для клиента можно и сгенерировать
По идее так и есть, обобщенный вариант решения — нужно создать некий универсальный язык и 2 транслятора, один в код C# ( код серверного приложения ) другой в JavaScript ( код клиентского приложения ). Код трансляторов будет написан 1 раз и зафиксирован, причем трансляцию можно проводить перед компиляцией веб-приложения, тем самым не будет издержек производительности.
Как вариант можно взять один из уже существующих языков, например клиенский или серверный.
Учитывая что язык JavaScript не типизирован строго, а C# типизирован, то проще переводить из C# в JavaScript;
Например
bool IsValid( string text )
{
if ( text.Length < 8 )
return false;
}
в Javascript перевести легко, просто убрав типы
function IsValid( text )
{
if ( text.Length < 8 )
return false;
}
обратно же перевести затруднительно, т.к. тип полей можно определить уже только по семантике текста , по производимым операциям.
С другой стороны в C# может использоваться оператор или метод который не преобразуется в JavaScript, например string.Split(','), поэтому тут накладывается ограничение на испольуемые в C# функции.
Отсюда получается следующее решение :
— использовать для создания алгоритма валидации C# или другой язык на стороне сервера, как правило строго типизированный, вынести данную реализацию в отдельные классы и файлы. Например
.\Validators\validatorlogin.cs
.\Validators\validatorpwd.cs
— создать утилиту которая преобразовывает метод IsValid класса из C# в соотвветсвующую функцию JavaScript, например в validatorlogin_IsValid()
— настроить сборку чтобы сначала запускалась утилита и генерила соответстующий js файл validators.js
Здравствуйте, Аноним, Вы писали:
А>По идее так и есть, обобщенный вариант решения — нужно создать некий универсальный язык и 2 транслятора, один в код C# ( код серверного приложения ) другой в JavaScript ( код клиентского приложения ). Код трансляторов будет написан 1 раз и зафиксирован, причем трансляцию можно проводить перед компиляцией веб-приложения, тем самым не будет издержек производительности.
А>Как вариант можно взять один из уже существующих языков, например клиенский или серверный.
А> — создать утилиту которая преобразовывает метод IsValid класса из C# в соотвветсвующую функцию JavaScript, например в validatorlogin_IsValid()
А> — настроить сборку чтобы сначала запускалась утилита и генерила соответстующий js файл validators.js
А ещё лучше ознакомиться с тем, что уже достигнуто в данной области. Напрмер,
здесь.
Всё уже давным-давно украдено. Как минимум длины, ограничения на инты, и регулярные выражения присутствуют как данность.
Для более экзотических сценариев совершенно необязательно писать утилиту, которая будет уметь парсить не самый простой язык С# и придумывать для него JavaScript — аналог.
Можно взять готовое дерево выражений, и работать сразу с ним, заморачивась исключительно back-end-ом.
Тогда в коде можно будет написать что-то вроде
AddValidator((string name)=>name.ToUpper()==name, "Uppercase string required");
А относительно рутинный код будет обходить дерево и превращать его в JavaScript-аналог.