вторник, марта 24, 2009

Кастомизация стандартных валидаторов

исходные коды
Вообщем-то, пришлось столкнуться с такой задачей: есть разметка с использованием стандартных валидаторов, нужно изменить работу валидаторов таким образом, чтобы вместо вывода сообщений об ошибках подсвечивать соотвествующий контрол рамкой или вообще менять стиль css.


В результате родился скрипт, текст которого приведен в конце топика.





В качестве примера покажу, как выглядит страница с использованием стандартных валидаторов:






И после применения javascript:









Чтобы добиться такого эффекта, мне требуется дописать в конце страницы или на событие pageLoaded (если использую на странице ScriptManager & PageRequestManager) следующий javascript-код:




<script language="javascript" type="text/javascript">
Web.Customization.validatorsStylingApply();
Web.Customization.invalidatedControlStyleName = "invalidatedControl";
Web.Customization.invalidatedSelectControlStyleName = "invalidatedSelectControl";
</script>





Свойство invalidatedControlStyleName используется для указания, какой стиль будет применен к валидируемому контролу в случае, если сам валидатор !isvalid; После того, как валидатор стал валидным - восстанавливается тот класс контрола, который был до применения стиля;

И описать соотвествующий стиль:

<style type="text/css">

.invalidatedControl {
border: 2px solid #DD0000;
}

</style>



Также поддерживается та ситуация, когда к контролу применяется несколько валидаторов, например:


<td>
<asp:TextBox ID="txtAdministrativeEmail" runat="server" Text="" Columns="40" MaxLength="40" Width="240px"></asp:TextBox>
<asp:RequiredFieldValidator ID="rfvEmail" runat="server"
ControlToValidate="txtAdministrativeEmail"
SetFocusOnError="false"
EnableClientScript="true"
Display="Dynamic"
ErrorMessage="Enter the correct administrative email"
Font-Size="12pt"></asp:RequiredFieldValidator>

<asp:RegularExpressionValidator ID="revEmail"
runat="server"
ControlToValidate="txtAdministrativeEmail"
Display="Dynamic"
SetFocusOnError="false"
EnableClientScript="true"
ErrorMessage="Invalid administrative email, please enter correct value..."
ValidationExpression=".*@.*\..*" ></asp:RegularExpressionValidator>
</td>






Собственно, сам код javascript-класса Web.Customization:



/* customization of validation controls */
var Web = {};
Web.Customization = function() {
///
///Helper class for the standart asp.net validators styling
///

this.invalidatedControlStyleName = "invalidatedControl";
this.invalidatedSelectControlStyleName = "invalidatedControl";
}

Web.Customization.prototype.validate = function() {
///
///Custom Validation proxy method
///

var hooked_result = false;
if (typeof Page_Validators != 'undefined' &&
Page_Validators != null) {

if (this["fwvalidator"] != null) {

var validator = this["fwvalidator"];
var fwevaluationfunction_object = eval("hooked_validator = " + this["fwevaluationfunction"]);
eval("hooked_result = hooked_validator(validator);")
validator.isvalid = hooked_result;
var object = $get(this["controltovalidate"]);
var controlstyle = "";

if (hooked_result) {
for (var i = 0; i < Page_Validators.length; i++) {
var previousValidator = Page_Validators[i];

if (previousValidator.controltovalidate == this.controltovalidate) {
if (previousValidator.id != this.id) {
hooked_result = previousValidator.isvalid;
}
else if (previousValidator.id == this.id) {
break;
}
}
}
}

if (hooked_result) {
if (this["controlstyle"] != null) {
controlstyle = this["controlstyle"];
object.className = controlstyle;

}
else
object.removeAttribute("className");

if (object.tagName == 'SELECT') {
var parentObj = object.parentElement;
if (parentObj.tagName == 'DIV') {
parentObj.removeAttribute("className");
}
}

}
else {
if (object.tagName == 'SELECT') {
var parentObj = object.parentElement;
if (parentObj.tagName == 'DIV') {
parentObj.className = Web.Customization.invalidatedSelectControlStyleName;
}
}
else {
object.className = Web.Customization.invalidatedControlStyleName;
}
}
}
}

return hooked_result;
};

Web.Customization.prototype.validatorsStylingApply = function() {
///
///Applies the custom styling logic into the all validators on the current page
///

if (typeof Page_Validators != 'undefined' &&
Page_Validators != null) {
var validators = Page_Validators;

for (var i = 0; i < validators.length; i++) {
if (validators[i].attributes["evaluationfunction"] != null) {

if (validators[i].attributes["display"] != null) {
validators[i].attributes.removeNamedItem("display");
}

var displayAttribute = document.createAttribute("display");
displayAttribute.value = "None";
validators[i].attributes.setNamedItem(displayAttribute);

if (validators[i]["fwvalidator"] == null) {
validators[i]["fwvalidator"] = validators[i];
validators[i]["fwevaluationfunction"] = validators[i].attributes["evaluationfunction"].value;
validators[i]["controltovalidate"] = validators[i].attributes["controltovalidate"].value;

var control = $get(validators[i]["controltovalidate"]);
if (control != null &&
control.className != null &&
control.className != '')
validators[i]["controlstyle"] = control.className;

validators[i].attributes["evaluationfunction"].nodeValue = Web.Customization.validate;
}
}
}
}
}

/* global objects initialization */
Web.Customization = new Web.Customization();





удачи в использовании, надеюсь, сама идея решения кому-нить пригодится...



Так и не нашел полный текст - Это я, добрый ЭЭх, а это мое ээхо...



...
- КТО ТАМ?

- Это я, добрый Ээх. Я здесь.
- И я здесь!
- А ты кто такой? Откуда взялся?
- С того берега моря.
- На чем приехал?
- Оседлал хромую блоху, сел и приехал.
- Море, что, лужа?
- Может и лужа, да только ту лужу орел не перелетел.
- Значит, орел - птенец!
- Наверно, птенец. Да только тень от его крыльев город закрывает, в городе ночь настает.
- Город-то, небось, крооохотный!
- Через тот город заяц бежал - не перебежал.
- Выходит, заяц маааленький!
- Заяц – как заяц. Из его шкуры тулуп вышел.
- Куда вышел?
- Вышел из того города, где заяц бежал, на который тень от орла упала, и пошел, куда глаза глядят.
- Чьи глаза???
- Глаза того тулупа, который из шкуры зайца вышел, в городе, где ночь настает, когда над ним птенец пролетает верхом на хромой блохе.
- ЧЕГО?!!!!
- Чего-чего. На хромой блохе с того берега моря, которое зайцу не перелететь, орлу не перебежать, хоть море - не море, а так - лужа посреди города, где тень от блохи на зайца упала и насмерть убила, а из шкуры зайца тулуп вышел и пошел, куда глаза глядят. Тут заяц кааак прыгнет!
- КАКОЙ ЗАЯЦ???
- Насмерть убитый – как прыгнет, куда глаза глядят, аж на тот берег моря, которое ни перелететь, ни перебежать, из которого тулуп вышел, на который тень от блохи упала и зайца убила, хоть заяц – не заяц, а орел!
- КАКОЙ ЗАЯЦ??? КАКОЙ ОРЕЛ??? КАКАЯ БЛОХА?????
- Повторить? Ну, значит, та самая блоха с того берега лужи…
...



ps: Какие мульты мы смотрели :)... ностальгия..

среда, марта 18, 2009

Курю

и читаю:
http://ru.wikipedia.org/wiki/Python


http://www.ibm.com/developerworks/ru/library/l-cpdecor/index.html




ну и собственно bdfl:
http://www.python.org/~guido/



ps: занимаюсь пайтоном второй месяц ... сказать, что сильно полюбил язык пока не могу, но и многих фишек языка уже не хватает :)




судя по отзывам в инете - основной бич это отсутствие вменяемой IDE, сам юзаю Wing - из всех рассматриваемых наиболее достойная




pps: a, b = b, a + b :)

пятница, марта 06, 2009

Удалить????






Курю

четверг, марта 05, 2009

Вот что значит правильно выбрать имя....Gooooooooooooooo!L!e

Альбом: Blog
Ps: стоило ошибиться в одной букве и мы получаем совсем другой поисковик :)

четверг, февраля 19, 2009

Did You Now

Знаете ли Вы что!!!!!


Альбом: Blog

вторник, февраля 03, 2009

Первый признак того, что пора в отпуск

Сел за соседний комп, установил тортойс, сделал checkout, скопировал путь рабочей папки ctrl+insert, сажусь за свой, делаю shift+insert и тупо не понимаю, почему не вставляет...:(

пятница, января 30, 2009

Specified argument was out of the range of valid values. Parameter name: utcDate

В очередной раз выкладывая на сервер приложение, заметил, что ajax-овый tab container control не загружает свои сборки..т.е. просто пропали стили обрамления самих вкладок, их подсветка при onmouseover, т.е. собственно то, что раньше отдавал ScriptResource.axd

Фидлером увидел 500 ошибку на обращение к обработчику ресурсов:


Specified argument was out of the range of valid values.
Parameter name: utcDate
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: utcDate

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: utcDate]
System.Web.HttpCachePolicy.UtcSetLastModified(DateTime utcDate) +3261043
System.Web.HttpCachePolicy.SetLastModified(DateTime date) +47
System.Web.Handlers.ScriptResourceHandler.PrepareResponseCache(HttpResponse response, Assembly assembly) +194
System.Web.Handlers.ScriptResourceHandler.ProcessRequest(HttpContext context) +1154
System.Web.Handlers.ScriptResourceHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext context) +4
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +154
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +64





этот эффект происходит изза эффекта "assemplies in the future" :)
т.е. из-за разницы в таймзонах у меня сборка ушла на сервер с датой поздней, чем серверное время и обработчик ресурсов для ajax сходит с ума

Как решение, просто откомпилить сборку с датой ранее даты серверного времени;

пятница, января 23, 2009

Динамическое создание вкладок для ajax tab container

Динамическое создание вкладок для ajax tab container;
Ситуация была следующая - в разметке был размещен контейнер, для которого создавал вкладки динамически...
разметка:

<ajaxtoolkit:tabcontainer id="tabContainerCompanyProfile" runat="server" enableviewstate="true" width="100%">
</ajaxtoolkit:tabcontainer>


до постбека все происходило нормально, при переходе на другую страницу или при постбеке получал сообщение:

System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.

ну и stack trace до вызова set_ActiveTabIndex;

лечится только динамическим созданием самого tab container как показано ниже:
помещаем в place holder и затем уже добавляем вкладки...


разметка:


<table>
<tr>
<td>
<asp:PlaceHolder ID="phTabContainer" runat="server" EnableViewState="true">
</asp:PlaceHolder>
</td>
</tr>
...........................


фрагмент кода:


var availableTabs = (from pd in this.ProfileDescriptors
where pd.CompanyTypes.Contains(this.CompanyType) &&
(pd.EditMode == EditMode.All || pd.EditMode == this.ProfileMode)
select pd).ToList();


if (availableTabs != null &&
availableTabs.Count > 0)
{

AjaxControlToolkit.TabContainer tabContainer = new AjaxControlToolkit.TabContainer();
tabContainer.Width = Unit.Parse("100%");
tabContainer.Enabled = true;
tabContainer.Visible = true;

phTabContainer.Controls.Add(tabContainer);

foreach (ProfileDescriptor profileDescriptor in availableTabs)
{
foreach (TabDescriptor tabDescriptor in profileDescriptor.TabDescriptors)
{
CompanyProfileTabs.CompanyPropertiesTabBase propertiesEditor = (CompanyProfileTabs.CompanyPropertiesTabBase)this.LoadControl(tabDescriptor.TabControlURL);
if (propertiesEditor != null)
{
AjaxControlToolkit.TabPanel tab = new AjaxControlToolkit.TabPanel();
tab.Visible = true;
tab.Width = Unit.Percentage(100);
tab.Enabled = true;
tab.HeaderText = tabDescriptor.HeaderCaption;

propertiesEditor.Visible = true;
tab.Controls.Add(propertiesEditor);


tabContainer.Tabs.Add(tab);

this.Tabs.Add(propertiesEditor);
}
}

}

if (this.Tabs.Count > 0)
{
tabContainer.ActiveTabIndex = 0;
}
}

среда, декабря 03, 2008

1000 commit :)

Нашему проекту ровно тысяча (1000!!!!) ле...коммитов :) с чем себя и поздравляем :)