# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > مقالات مرتبط با Microsoft .Net Framework >  BehooPersianDateValidator - کامپوننتی برای بررسی صحت تاریخ شمسی در ASP.NET

## Behrouz_Rad

کنترل های Validator در ASP.NET، مجموعه ی کاملی هستند اما امکانی برای بررسی صحت تاریخ شمسی ارائه نمیدن.
از این رو بر آن شدم تا با ایجاد یک کامپوننت، این قابلیت رو برای تاریخ شمسی ایجاد کنم.

*چند نکته پیرامون این کنترل:*

1) استفاده از این کنترل دقیقاً همانند کنترل های Validation در ASP.NET هست.

2) این کنترل، بررسی رو در دو سطح کلاینت و سرور انجام میده.

3) برای این کنترل، چند قابلیت منحصر به فرد هم در نظر گرفتم. سه خاصیت اضافه ای که علاوه بر خواص معمول کنترل های Validation در ASP.NET برای این کنترل ایجاد کردم شامل:
- *خاصیت FirstWhat:* با استفاده از این خاصیت می تونید تعیین کنید که در مقدار تاریخ، ابتدا روز ذکر بشه یا سال. مقدار FirstDay، وجود روز در شروع تاریخ رو بررسی می کنه. مقدار FirstYear، وجود سال در شروع تاریخ رو بررسی می کنه.
- *خاصیت AcceptWithoutZero:* این خاصیت مشخص می کنه که آیا پیش از اعداد تک رقمی در قسمت روز و ماه، وجود صفر اختیاری هست یا خیر. به عنوان مثال، آیا علاوه بر عبارت 1387/12/02، عبارت 1387/12/2 نیز صحیح است یا خیر.
- *خاصیت ValidateEmptyText:* در مجموعه کنترل های Validator در ASP.NET، فقط کنترل Custom Validator این خاصیت رو داره. این خاصیت مشخص می کنه که آیا کاربر حتماً باید عبارتی رو در کنترل مقصد وارد کنه یا خیر.

4) این کنترل، بررسی سال کبیسه رو هم انجام میده.

5) در حال حاضر، این کامپوننت رو به صورت یک dll منتشر کردم. کدهای اون رو احتمالاً! بعد از مدتی منتشر می کنم.

دوستان عزیز، اگر در رابطه با استفاده از این کنترل به مشکلی برخورد یا باگی مشاهده کردند، در همین تاپیک اعلام بفرمایند.

موفق باشید.

پ.ن: آپدیت اول در تاریخ 1387/9/19: اضافه شدن قابلیت درج سال دو رقمی.

پ.ن: آپدیت دوم در تاریخ 1389/3/17: بر طرف شدن تداخل وجود چند نمونه از کامپوننت در صفحه. و انتشار Source کامپوننت.
این کامپوننت با VS 2008 و VB.NET نوشته شده است.

تعداد دانلودهای نسخه ی اول تا تاریخ 17/3/1389 برابر با 1219

----------


## mahdi_farhani

با تشکر از زحمت شما 
دومورد بود گفتم بگم بهتره 
1-به علت اینکه ساختار Validator ها دات نت رو داره ، با Ajax مشکل داره ( البته اینو همه میدونن )
2-اگر تاریخ به صورت 1/1/87 وارد بشه error میده در صورتی که این تاریخ صحیح است

----------


## Behrouz_Rad

> 1-به علت اینکه ساختار Validator ها دات نت رو داره ، با Ajax مشکل داره ( البته اینو همه میدونن )


در نظر دارم تا در آینده، رفتار AJAX ای رو واسش ایجاد کنم. حتی بدون اینکه نیاز به UpdatePanel داشته باشید. مثلاً یک خاصیت true یا false که مشخص می کنه آیا رفتار AJAX داشته باشه یا خیر.



> 2-اگر تاریخ به صورت 1/1/87 وارد بشه error میده در صورتی که این تاریخ صحیح است


از عمد این تاریخ رو مجاز در نظر نمی گیرم! به هر حال آینده نگری حکم می کنه که سال به طور کامل وارد بشه. من سال 1487 رو هم در نظر گرفتم ;)
اگر توجیح داشته باشه، میشه خاصیتی برای تعیین رفتار برای سال دو رقمی رو پیاده سازی کرد.

موفق باشید.

----------


## mahdi_farhani

برای سال دو رقمی میتونی یک فیلد براش تنظیم کنی که چه دو رقمی را اضافه کنه البته فقط برای دو رقمی ها کنترل بشه. البته این نظر من ، تشخیص با خودتون هست .

----------


## salehbagheri

خيلي ممنون از شما!

اگر بتونيد كاري كنيد كه تاريخ رو به صورت فارسي هم بگيره بهتر ميشه!

مثلا : (16 آذر 1387) يا (شانزده - آذر - هزار و سيصد و هشتاد و هفت)

----------


## Behrouz_Rad

> اگر بتونيد كاري كنيد كه تاريخ رو به صورت فارسي هم بگيره بهتر ميشه!
> 
> مثلا : (16 آذر 1387) يا (شانزده - آذر - هزار و سيصد و هشتاد و هفت)


فکر خوبیه. در موردش فکر می کنم.

----------


## cactuskhan

> در نظر دارم تا در آینده، رفتار AJAX ای رو واسش ایجاد کنم. حتی بدون اینکه نیاز به UpdatePanel داشته باشید. مثلاً یک خاصیت true یا false که مشخص می کنه آیا رفتار AJAX داشته باشه یا خیر.
> 
> از عمد این تاریخ رو مجاز در نظر نمی گیرم! به هر حال آینده نگری حکم می کنه که سال به طور کامل وارد بشه. من سال 1487 رو هم در نظر گرفتم ;)
> اگر توجیح داشته باشه، میشه خاصیتی برای تعیین رفتار برای سال دو رقمی رو پیاده سازی کرد.
> 
> موفق باشید.


به نظر من هم اگه 1/1/87 رو بگیره بهتره !!!
ما 2 سال دیگه رو نمی تونیم قطعا بگیم که این کنترل بدرد ما میخوره یا نه !!؟  اونوقت شما  100 سال دیگه رو در نظر گرفتی ؟؟ :متفکر:

----------


## Behrouz_Rad

بنا به درخواست دوستان، قابلیت درج سال دو رقمی رو هم به این کامپوننت اضافه کردم.
نسخه ی جدید رو از پست اصلی دانلود بفرمایید.

----------


## anubis_ir

آقاي راد، اوپن سورسش كن بذار بچه‌ها يه چيزي ياد بگيرن :)

----------


## Behrouz_Rad

> آقاي راد، اوپن سورسش كن بذار بچه‌ها يه چيزي ياد بگيرن :)


چشم برادر، منتشر می کنم. شما تا حالا دیدی من چیزی منتشر کنم و سورسش رو ندم؟ ما که تا حالا هر چی داشتیم در طبق اخلاص برای دوستان گذاشتیم ;) بعضی ملاحظات در برخی موارد حکم می کنه که سورس در بازه ی زمانی مشخصی بعد از عرضه ی محصول منتشر بشه. این بازه ی زمانی به عوامل مختلفی بستگی داره که تصمیم گیری در مورد این زمان به صاحب محصول برمیگرده :)

موفق باشید.

----------


## Behrouz_Rad

بالاخره بعد از 2 سال حسی دست داد که دستی روی سر و روی این کامپوننت بکشم. مشکلی که وجود داشت و یکی از دوستان اشاره کرده بود این بود که اگر چند نمونه از این کامپوننت رو بر روی صفحه قرار بدید، تنظیمات اعمال شده به اولین نمونه به بقیه ی نمونه ها نیز نسبت داده میشه. در نسخه ی دوم این کامپوننت این مشکل رو بر طرف کردم و طبق قول داده شده به صورت متن باز اون رو منتشر کردم...
لطفاً از پست اصلی دانلود بفرمایید.

موفق باشید.

----------


## Morteza_68

سلام به اساتيد محترم
اگه لطف كنيد و يه توضيح درباره چگونگي استفاده از اين كامپوننت براي تازه كارهايي مثل من بگيد ممنون ميشم ...

----------


## Behrouz_Rad

> سلام به اساتيد محترم
> اگه لطف كنيد و يه توضيح درباره چگونگي استفاده از اين كامپوننت براي تازه كارهايي مثل من بگيد ممنون ميشم ...


مثالی در مورد نحوه ی استفاده، ضمیمه هست. دقیقاً همانند یک کنترل Validator عمل می کنه.

موفق باشید.

----------


## SabaSabouhi

> مثالی در مورد نحوه ی استفاده، ضمیمه هست. دقیقاً همانند یک کنترل Validator عمل می کنه.
> 
> موفق باشید.


سلام
نخست از نشر سورس برنامه‌تون سپاس‌گزارم.
من پروژه رو باز کردم بدون هیچ مشکلی اجرا شد. به #C تبدیلش کردم باز هم بدون مشکل
اجرا شد. ( با یک مبدل کد )
اما وقتی که پروژه‌ی جدیدی رو از نوع Class Library باز می‌کنم و همون فایل‌ها رو بهش اضافه می‌کنم مشکل داره و نمی‌تونه فایل js. رو بخونه. اشکال کار من کجاس؟
راستی یادم بوده که build action رو روی Embedded Resource تنظیم کنم. اما یه مشکل
دیگه باید داشته باشه کارم که درست کامپایل نمی‌شه. و حجم فایل dll من هم کوچیک‌تراز فایلی هست که با برنامه‌ی تبدیل شده ایجاد می‌شه.

صبا صبوحی

----------


## SabaSabouhi

با سلام مجدد
جناب راد، اگه به پرسش من پاسخ بدهید خیلی سپاس‌گزار می‌شوم.

صبا صبوحی

----------


## Behrouz_Rad

> با سلام مجدد
> جناب راد، اگه به پرسش من پاسخ بدهید خیلی سپاس‌گزار می‌شوم.
> 
> صبا صبوحی


سلام.
نمی دونم.

----------


## Software.Student2010

سلام جناب راد

کدها رو منتشر نمی کنید.
گفتید که منتشر می کنید و 2 سال گذشت

----------


## Behrouz_Rad

> سلام جناب راد
> 
> کدها رو منتشر نمی کنید.
> گفتید که منتشر می کنید و 2 سال گذشت


همیشه با دقت یک تاپیک رو مطالعه بفرمایید.
کدها رو خیلی وقته منتشر کردم. از پست اصلی دانلود بفرمایید.

موفق باشید.

----------


## صادق صدقی

سلام آقای  راد
من از کامپونننت شما  استفاده کردم
در حالت معمولی کار می کرد و ولیدییت می شد
اما اگر  کاربر کلید می کرد و تند تند ثبت رو می زد(تو صفحم دکمه گذاشته بودم)بعد از 20 باز زدن ولیدی شن کار نمی کرد و اطلاعات ثبت می شد!!!!!
و مجبور شدم برش دارم
لطفا یک بررسی انجام بدین 
منتظره خبرتون هستم

----------


## انتظاری

سلام من تا حالا با این جور برنامه ها کار نکردم و نمی دانم اگر بخوام از روی برنامه شما این کنترل را درپروژه خودم استفاده کنم کدوم فایل را باید در برنامه خودم کپی کنم لطفا راهنمایی کنبد

----------


## Developer Programmer

مهندس راد، من به یه مشکلی برخوردم.
از Telerik RadMaskedTextBox استفاده میکنم 
ماسک رو روی 
13##/##/## 
می ذارم. این کامپوننت خروجی پراپرتی Text رو بدون لیترال ها برمیگردونه یعنی خروجی مثل این میشه 800112  اما وقتی با پراپرتی TextWithLiteral می خونی کل رشته رو برمیگردونه مثل 1380/01/12  و همین امر باعث میشه، کامپوننت شما درست اجرا نشه. 
لطف بفرمایین بگین کجای کدتون رو تغییر بدم و آیا براتون مقدوره زحمتش رو بکشین؟

----------


## Developer Programmer

جناب مهندس راد. من کد کلاس رو اینطوری تغییر دادم
         Protected Overrides Function EvaluateIsValid() As Boolean

            Dim checkEmptyResult As Boolean = False
            Dim checkFormat As Boolean = False
            Dim checkInRange As Boolean = False
            Dim ControlValue As String = Me.ControlValue

            checkEmptyResult = Me.CheckEmpty(ControlValue)

            If (Me.ValidateEmptyText) Then
                If (checkEmptyResult) Then Return False
            End If

            If (checkEmptyResult = False) Then
                If SmallDate Then
                    If ControlValue.Length <> 6 Then Return False
                    ControlValue = "13" & ControlValue.Substring(0, 2) & "/" & ControlValue.Substring(2, 2) & "/" & ControlValue.Substring(4, 2)
                End If
                checkFormat = Me.CheckFormat(ControlValue)
                If (checkFormat = False) Then Return False
            End If

            If (checkEmptyResult = False) Then
                checkInRange = Me.CheckInRange(ControlValue)
                If (checkInRange = False) Then Return False
            End If

            Return True

        End Function
و
    Page.ClientScript.RegisterExpandoAttribute(Me.Clie  ntID, "smalldate", Me.fSmallDate.ToString())
سپس در فایل اسکریپت این تغییرات رو اعمال کردم
function smallDate() {
    return gs.smalldate;
}

و
function validatePersianDate(val) {

    gs = val;

    var resultCheckEmpty = false;
    var resultFormat = false;
    var resultInRange = false;
    var value = ValidatorGetValue(val.controltovalidate);

    resultCheckEmpty = checkEmpty(value);

    if (validateEmptyText() == "True") {
        if (resultCheckEmpty == true)
            return false;
    }

    if (resultCheckEmpty == false) {

        if (smallDate() == "True") {
            if (value.length != 6) { alert(value.length); return false; }
            value = "13" + value.substr(0, 2) + "/" + value.substr(2, 2) + "/" + value.substr(4, 2);
            }
        resultFormat = checkFormat(value);
        if (resultFormat == false)
            return false;
    }

    if (resultCheckEmpty == false) {
        resultInRange = checkInRange(value);
        if (resultInRange == false)
            return false;
    }

    return true;
}

        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <cc1:PersianDateValidator ID="PersianDateValidator1" runat="server" 
            FirstWhat="FirstYear" ControlToValidate="TextBox1" Text="*" 
            ValidateEmptyText="True" SmallDate="True" ErrorMessage="*" 
            EnableClientScript="False" ></cc1:PersianDateValidator>
        <asp:Button ID="Button1" runat="server" Text="Button" />

الان کنترل همیشه درست کار نمی کنه. یه راه حلی چیزی ؟!

----------


## babak2000

بهروز جان مر30

نمیشه یه ماسک براش بذاری دیگه احتیاج به تایپ " / " نباشه ؟

----------


## ایرانخواه

سلام می شه لطفا درباره نحوه استفادش بیشتر توضیح بدین؟ 
ممنون

----------

