PDA

View Full Version : BehooPersianDateValidator - کامپوننتی برای بررسی صحت تاریخ شمسی در ASP.NET



Behrouz_Rad
دوشنبه 11 آذر 1387, 00:34 صبح
کنترل های 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
دوشنبه 11 آذر 1387, 20:05 عصر
با تشکر از زحمت شما
دومورد بود گفتم بگم بهتره
1-به علت اینکه ساختار Validator ها دات نت رو داره ، با Ajax مشکل داره ( البته اینو همه میدونن )
2-اگر تاریخ به صورت 1/1/87 وارد بشه error میده در صورتی که این تاریخ صحیح است

Behrouz_Rad
دوشنبه 11 آذر 1387, 22:39 عصر
1-به علت اینکه ساختار Validator ها دات نت رو داره ، با Ajax مشکل داره ( البته اینو همه میدونن )

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


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

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

موفق باشید.

mahdi_farhani
سه شنبه 12 آذر 1387, 02:27 صبح
برای سال دو رقمی میتونی یک فیلد براش تنظیم کنی که چه دو رقمی را اضافه کنه البته فقط برای دو رقمی ها کنترل بشه. البته این نظر من ، تشخیص با خودتون هست .

salehbagheri
شنبه 16 آذر 1387, 12:12 عصر
خيلي ممنون از شما!

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

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

Behrouz_Rad
شنبه 16 آذر 1387, 12:33 عصر
اگر بتونيد كاري كنيد كه تاريخ رو به صورت فارسي هم بگيره بهتر ميشه!

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

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

cactuskhan
شنبه 16 آذر 1387, 13:47 عصر
در نظر دارم تا در آینده، رفتار AJAX ای رو واسش ایجاد کنم. حتی بدون اینکه نیاز به UpdatePanel داشته باشید. مثلاً یک خاصیت true یا false که مشخص می کنه آیا رفتار AJAX داشته باشه یا خیر.

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

موفق باشید.

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

Behrouz_Rad
سه شنبه 19 آذر 1387, 14:47 عصر
بنا به درخواست دوستان، قابلیت درج سال دو رقمی رو هم به این کامپوننت اضافه کردم.
نسخه ی جدید رو از پست اصلی دانلود بفرمایید.

anubis_ir
سه شنبه 19 آذر 1387, 22:15 عصر
آقاي راد، اوپن سورسش كن بذار بچه‌ها يه چيزي ياد بگيرن :)

Behrouz_Rad
سه شنبه 19 آذر 1387, 23:00 عصر
آقاي راد، اوپن سورسش كن بذار بچه‌ها يه چيزي ياد بگيرن :)

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

موفق باشید.

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

موفق باشید.

Morteza_68
پنج شنبه 25 شهریور 1389, 00:18 صبح
سلام به اساتيد محترم
اگه لطف كنيد و يه توضيح درباره چگونگي استفاده از اين كامپوننت براي تازه كارهايي مثل من بگيد ممنون ميشم ...

Behrouz_Rad
پنج شنبه 25 شهریور 1389, 00:44 صبح
سلام به اساتيد محترم
اگه لطف كنيد و يه توضيح درباره چگونگي استفاده از اين كامپوننت براي تازه كارهايي مثل من بگيد ممنون ميشم ...
مثالی در مورد نحوه ی استفاده، ضمیمه هست. دقیقاً همانند یک کنترل Validator عمل می کنه.

موفق باشید.

SabaSabouhi
دوشنبه 19 مهر 1389, 09:18 صبح
مثالی در مورد نحوه ی استفاده، ضمیمه هست. دقیقاً همانند یک کنترل Validator عمل می کنه.

موفق باشید.

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

صبا صبوحی

SabaSabouhi
دوشنبه 10 آبان 1389, 17:39 عصر
با سلام مجدد
جناب راد، اگه به پرسش من پاسخ بدهید خیلی سپاس‌گزار می‌شوم.

صبا صبوحی

Behrouz_Rad
دوشنبه 10 آبان 1389, 21:14 عصر
با سلام مجدد
جناب راد، اگه به پرسش من پاسخ بدهید خیلی سپاس‌گزار می‌شوم.

صبا صبوحی
سلام.
نمی دونم.

Software.Student2010
دوشنبه 22 آذر 1389, 10:58 صبح
سلام جناب راد

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

Behrouz_Rad
دوشنبه 22 آذر 1389, 16:46 عصر
سلام جناب راد

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

موفق باشید.

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

انتظاری
یک شنبه 01 اسفند 1389, 14:03 عصر
سلام من تا حالا با این جور برنامه ها کار نکردم و نمی دانم اگر بخوام از روی برنامه شما این کنترل را درپروژه خودم استفاده کنم کدوم فایل را باید در برنامه خودم کپی کنم لطفا راهنمایی کنبد

Developer Programmer
پنج شنبه 15 اردیبهشت 1390, 12:43 عصر
مهندس راد، من به یه مشکلی برخوردم.
از Telerik RadMaskedTextBox استفاده میکنم
ماسک رو روی

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

Developer Programmer
یک شنبه 18 اردیبهشت 1390, 09:59 صبح
جناب مهندس راد. من کد کلاس رو اینطوری تغییر دادم
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
دوشنبه 14 شهریور 1390, 16:44 عصر
بهروز جان مر30

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

ایرانخواه
چهارشنبه 04 آبان 1390, 19:58 عصر
سلام می شه لطفا درباره نحوه استفادش بیشتر توضیح بدین؟
ممنون