Довольно часто можно столкнуться с проблемой, когда на одной странице находятся две «формы», правильность данных в которых необходимо проверять по отдельности. Обычно приходиться жертвовать клиентской частью проверок и делать все проверки на сервере, но не очень удобно.
Далее мы рассмотрим способы, которыми можно реализовать частичную проверку. Первый способ достаточно прост и подходит, когда у нас все проверяющие элементы управления (Валидаторы) находятся на одной странице. Ниже представлен пример того, как это реализуется.
<%@ Page %> <%@ Import Namespace=System.Collections%> <head> <script language=javascript> function EnableValidationGroup( activeValidators ) { // Если на странице нет валидаторов то ничего не делаем if (typeof(Page_Validators)==undefined) return;
//Выключаем все валидаторы for( i = 0; i < Page_Validators.length; i++ ) Page_Validators[i].enabled = false;
//Включаем нужные нам валидаторы for( i = 0; i < activeValidators.length; i++ ) activeValidators[i].enabled = true; } </script> <script runat=server language=c#> Hashtable _validationGroups = new Hashtable();
Но, в случае использования данного функционала на нескольких страницах, приходится делать Copy & Paste кода, что не очень красиво и муторно, тем более, что достаточно просто допустить ошибку. Для того чтобы избежать этого, мы инкапсулируем всю логику в отдельный элемент управления.
using System; using System.IO; using System.Web.UI; using System.Web.UI.WebControls; using System.ComponentModel; namespace TestWebControls { [ Designer(System.Web.UI.Design.WebControls.PanelDesigner, System.Design, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a), PersistChildren(true), ParseChildren(false)] public class ValidationGroup : Panel { public static readonly string ValidationGroupScriptKey = __validationGroupScript; protected override void Render(HtmlTextWriter writer) { base.RenderChildren(writer); } protected override void OnPreRender(EventArgs e) { if(!Page.IsClientScriptBlockRegistered(ValidationGroupScriptKey)) { string resourceName = typeof(ValidationGroup).Namespace + .Resources.ValidationGroup.js; using(StreamReader reader = new StreamReader( typeof(ValidationGroup).Assembly.GetManifestResourceStream(resourceName))) { Page.RegisterClientScriptBlock(ValidationGroupScriptKey,reader.ReadToEnd()); } } RegisterValidators(this); base.OnPreRender (e); } public string GetValidationGroupScript() { return string.Format(if (typeof({0}_Validators)!=undefined) + {{ EnableValidationGroup({0}_Validators,{0}_InitialEnabled)}} else + {{EnableValidationGroup();}};,ClientID); } public void RegisterControl(Button button) { button.Attributes.Add(onclick,GetValidationGroupScript()); } public void RegisterControl(LinkButton button) { button.Attributes.Add(onclick,GetValidationGroupScript()); } public bool IsValid { get { return CheckValidators(this); } } bool CheckValidators(Control c) { bool isValid = true; foreach(Control childControl in c.Controls) { if (childControl is BaseValidator && childControl.Visible) { BaseValidator validator = (BaseValidator)childControl; if (validator.Enabled) { isValid &= validator.IsValid; } } else { if (childControl is INamingContainer && childControl.Visible) { isValid &= CheckValidators(childControl); } } } return isValid ; } void RegisterValidators(Control c) { foreach(Control childControl in c.Controls) { if (childControl is BaseValidator && childControl.Visible) { Page.RegisterArrayDeclaration(ClientID + _Validators, string.Format(document.all[{0}],childControl.ClientID)); Page.RegisterArrayDeclaration(ClientID + _InitialEnabled, ((BaseValidator)childControl).Enabled.ToString().ToLower()); } else { if (childControl is INamingContainer && childControl.Visible) { RegisterValidators(childControl); } } } } } }
Кроме того, как видно из кода, клиентский скрипт был вынесен в ресурсный файл
<script language=javascript> function EnableValidationGroup( activeValidators, initialValues ) { // Если на странице нет валидаторов то ничего не делаем if (typeof(Page_Validators)==undefined) return; //Выключаем все валидаторы for( i = 0; i < Page_Validators.length; i++ ) Page_Validators[i].enabled = false; if (typeof(activeValidators)==undefined) return; //Включаем нужные нам валидаторы for( i = 0; i < activeValidators.length; i++ ) activeValidators[i].enabled = initialValues[i]; } </script>
Ну и в конце, приведу пример использования нашего элемента управления в aspx страничке.