November 2019

S M T W T F S
      12
34 5 678 9
10111213141516
17181920212223
24252627282930

Style Credit

Expand Cut Tags

No cut tags
Tuesday, March 10th, 2009 11:07 am
Покопался немножко в ASP.NET. Совсем чуть-чуть. Что я могу сказать.. Идея отделить веб-представление от кода - замечательная. Потому что куски html, перемешанные с серверным кодом на jscript/vb/php/ещё чём-нибудь - это ужасно, за это надо сразу расстреливать через повешение с пожизненным лишением права программировать.

Идея замечательная.. Но всё, что вы делаете руками реализация местами убивает напрочь.

Приделываете вы, скажем, к форме валидатор какого-нибудь поля. На нём английским по белому написано runat="server". И можете по наивности подумать, что обрабатываться он будет на сервере. Агащазблин, размечтались. То есть, на сервере он тоже будет, и это правильно.

Но - в дополнение к этому он _иногда_ может обрабатываться и на клиенте. Клиентским джавскриптом, который встраивается высокоинтеллектуальным движком ASP.NET в отдаваемую клиенту html-страницу. Если движок сочтет, что клиентский браузер достаточно умён для обработки этого джаваскрипта. А если недостаточно - то форма будет каждый раз отправляться на сервер и проверяться там.

Не, вообще говоря, предварительная проверка на клиенте - это правильно, чтоб лишний раз не гонять форму туда-обратно. Но. В результате валидация формы работает то так, то эдак.

Например, приделали вы к одному управляющему элементу CustomValidator, который работает только на сервере, а к трём другим стандартные, который работают и на сервере, и на клиенте. Ошибки от последних трёх элементов вы получите сразу, а от первого - ТОЛЬКО после правильного заполнения остальных трёх. Потому что пока вы их правильно не заполните, форма на сервер вообще не отправится, и обработчик CustomValidator'а не запустится.

Это если высокоинтеллектуальный ASP.NET решит, что ваш браузер достаточно умён. А если нет, то форма сразу отправится на сервер и там сработают сразу все четыре валидатора.
Этот искусственный интеллект движка можно отключить, однако ж по умолчанию он включён.

Далее. Обработчик CustomValidator'а не вызывается, если в поле ничего не ввести. Ну действительно, фигня какая, раз не заполнили - значит, это ненужное поле какое-то, чего его проверять-то..
И это не баг, это вполне документированная фича такая.

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

Или можно приделать к полю дополнительный валидатор - RequiredFieldValidator. Который, кстати, проверяет поле вовсе не на непустоту, а на отличие от первоначального значения.
Оно работает, но по-моему, при наличии специально написанного программистом CustomValidator'а такой способ сильно отдаёт ненатурализмом.

В общем, хотели, как лучше..
Tuesday, March 10th, 2009 12:46 pm (UTC)
> с точки зрения чистой философии проверять свойство объекта (обязательность поля) по наличию отдельной от этого объекта сущности (валидатора), на которую сам объект не ссылается - нелогично :)

Согласен. Не знаю с чем связано, но мне думается, что не в последнюю очередь с самой убогостью веба.

> вот если б всё это было ещё явно описано

Опять же консенсус. :)