در پیاده سازی یک برنامه تحت وب با استفاده از ASP.NET نیاز داشتم که کاربر را مجبور کنم که از گزینه های موجود در یک ListBox، حداقل یک مورد را انتخاب کند. بدیهی است که این کار با استفاده از یک کنترل استاندارد و موجود در ASP.NET بنام RequiredFieldValidator براحتی قابل انجام است. کافی است صفت ControlToValidate مربوط به این کنترل اعتبارسنجی را مطابق نام ListBox خود قرار دهید و همین!
اما چند سوال: اگر خواستید کاربر را مجبور به انتخاب دو گزینه یا بیشتر نمائید چطور؟ یا اگر خواستید کنترل بیشتری بر ورودی صفحه تان داشته باشید یا بعبارت دیگر بعنوان یک برنامه نویس حرفه ای ASP.NET، مانور بیشتری در این زمینه داشته باشید؟ یا شاید اصلا نیاز داشتید که کنترل های اعتبارسنجی خاصی را مطابق نیازتان داشته باشید که تاکنون نوشته نشده باشند؟
در این مقاله کوتاه سعی شده است تا جواب همه سوالات فوق با ارائه یک کنترل اعتبارسنجی نمونه و آموزشی داده شود. این کنترل سعی دارد که اندکی بیشتر از رفتار کنترل اعتبارسنجی معروف RequiredFieldValidator را شبیه سازی نماید و شما با یاد گرفتن اصول بکار رفته در آن می توانید آن را توسعه داده یا کنترلهای اعتبارسنجی متنوع دیگری را به کتابخانه کنترلهای خود اضافه نمائید.
قبل از پرداختن به برنامه مذکور دقت داشته باشید که این کنترل دارای محدودیتها و ویژگیهای زیر می باشد:
• این کنترل از کلاس استاندارد BaseValidator مشتق (به ارث) گرفته شده است.
• در این برنامه فقط به اعتبارسنجی سمت کاربر یا اصطلاحا Client Side پرداخته شده است.
• جهت انجام اعتبارسنجی سمت سرور یا Server Side نیاز است که متد مربوطه را خودتان بنویسید و به آن اضافه کنید.
• با استفاده از مقداردهی صفت RequieredItem مربوط به این کنترل می توانید تعداد گزینه هایی که باید توسط کاربر حتما انتخاب شود را تعیین کنید(دقت داشته باشید که برای حالت بیش از یک گزینه لازم است که صفت SelectionMode مربوط به ListBox شما قبلا مطابق مقدار Multiple تنظیم شده باشد).
• می توانید از این کنترل احتمالا با اعمال تغییرات کوچکی برای سایر کنترلها مانند DropDownList ،CheckBoxList یا RadioButtonList نیز استفاده کنید.
خوب فکر کنم حرف زدن کافی است و زودتر برویم سراغ اصل مطلب:
using System;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace MyLib
{
/// <summary>
/// Summary description for RequieredListBoxValidator.
/// </summary>
public class RequieredListBoxValidator : BaseValidator
{
protected int _RequieredItem = 1;
public int RequieredItem
{
get
{
return this._RequieredItem;
}
set
{
this._RequieredItem = value;
}
}
protected override bool ControlPropertiesValid()
{
return true;
}
protected override bool EvaluateIsValid()
{
return this.EvaluateHasItem();
}
protected bool EvaluateHasItem()
{
ListBox _lstb = ( ( ListBox ) this.FindControl( this.ControlToValidate ) );
return (_lstb.Items.Count != 0);
}
protected override void OnPreRender( EventArgs e )
{
if ( this.EnableClientScript ) { this.ClientScript(); }
base.OnPreRender( e );
}
protected void ClientScript()
{
this.Attributes["evaluationfunction"] = “lb_verify”;
StringBuilder sb_Script = new StringBuilder();
sb_Script.Append( “<script language=\”javascript\”>” );
sb_Script.Append( “\r” );
sb_Script.Append( “\r” );
sb_Script.Append( “function lb_verify(val) {” );
sb_Script.Append( “\r” );
sb_Script.Append( “var val = document.all[document.all[\"" );
sb_Script.Append( this.ClientID );
sb_Script.Append( "\"].controltovalidate];” );
sb_Script.Append( “\r” );
sb_Script.Append( “if ( val != null ) {” );
sb_Script.Append( “\r” );
sb_Script.Append( “if (val.tagName == \”SELECT\”) {” );
sb_Script.Append( “\r” );
sb_Script.Append( “var selCount = 0;\r” );
sb_Script.Append( “var i;\r” );
sb_Script.Append( “for(i=0;i<val.options.length;i++)\r” );
sb_Script.Append( “{\r” );
sb_Script.Append( “if(val.options[i].selected)\r” );
sb_Script.Append( “selCount++;\r” );
sb_Script.Append( “}\r” );
sb_Script.Append( “if ( selCount >= ”
+ this._RequieredItem.ToString () + ” ) {” );
sb_Script.Append( “\r” );
sb_Script.Append( “return true;” );
sb_Script.Append( “\r” );
sb_Script.Append( “}” );
sb_Script.Append( “\r” );
sb_Script.Append( “}” );
sb_Script.Append( “\r” );
sb_Script.Append( “\r” );
sb_Script.Append( “return false;” );
sb_Script.Append( “\r” );
sb_Script.Append( “}” );
sb_Script.Append( “\r” );
sb_Script.Append( “}” );
sb_Script.Append( “\r” );
sb_Script.Append( “</script>” );
this.Page.RegisterClientScriptBlock( “LSBScript”, sb_Script.ToString() );
}
}
}
کلاس فوق را در قالب یک Assembly (یا همان DLL خودمان اما از نوع دات نت) کامپایل کنید و DLL بدست آمده را در قسمت References برنامه استفاده کننده از این کنترل در VS.NET به برنامه خود الصاق نمائید. حال جهت استفاده از این کنترل مطابق زیر عمل کنید.
<%@ Register TagPrefix=”mylib” Namespace=”MyLib” Assembly=”MyLib” %>
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN” >
<HTML>
<HEAD>
<title>WebForm1</title>
<meta name=”GENERATOR” Content=”Microsoft Visual Studio 7.0″>
<meta name=”CODE_LANGUAGE” Content=”C#”>
<meta name=”vs_defaultClientScript” content=”JavaScript”>
<meta name=”vs_targetSchema” content=”http://schemas.microsoft.com/intellisense/ie5″>
</HEAD>
<body MS_POSITIONING=”FlowLayout”>
<form id=”WebForm1″ method=”post” runat=”server”>
<asp:ListBox id=”ListBox1″ runat=”server” SelectionMode=”Multiple”>
<asp:ListItem Value=”1″>Item 1</asp:ListItem>
<asp:ListItem Value=”2″>Item 2</asp:ListItem>
<asp:ListItem Value=”3″>Item 3</asp:ListItem>
</asp:ListBox>
<mylib:RequieredListBoxValidator id=”RequieredListBoxValidator1″ runat=”server” RequieredItem=”2″ ErrorMessage=”You have to select at least 2 items from list box!” ControlToValidate=”ListBox1″></mylib:RequieredListBoxValidator>
<br>
<asp:Button id=”Button1″ runat=”server” Text=”Button”></asp:Button>
</form>
</body>
</HTML>
دیدگاه خود را بیان کنید.
باید وارد سایت شده باشید برای دیدگاه دادن