آی تی نرد

اشتراک اطلاعات و تجربیات در زمینه ی توسعه ی دات نت و البته شیرپوینت

تاریخ و زمان شمسی در MVC بدون نیاز به استفاده از تمپلیت

shamsi datetime

حل مشکل تاریخ و زمان شمسی در اکثر پروژه های نرم افزاری که کار میکنیم یک کار مازاد به شمار میاد که باید در گوشه ای از ذهنمون در نظر داشته باشیم و معمولا هم در انتهای پروژه نسبت به رفع اون اقدام میکنیم. البته هر کسی روشی داره و بالاخره این مشکل رو حل میکنه. خود من یادم هست که حدود 8 الی 9 سال پیش قسمت های سال و ماه و روز تاریخ شمسی رو به صورت عددی کنار هم میچسبوندم و توی جدول نگهداری میکردم که البته کار اشتباهی بود.

بهترین روش این هست که هر مقداری معادل کاربردش در سیستم و با نوع متناسب نگهداری بشه و مقادیر در زمان و لایه ی نمایش تغییر کنند. به هر حال مثلا وقتی میگیم تاریخ تولد، نوعش هم باید تاریخ باشه.

توی پروژه های MVC معمولا برای حل این مسئله یک تمپلیت برای نمایش و یکی هم برای ویرایش(که در نهایت مقدار به سرور ارسال میشود) استفاده می کنیم که در تمپلیت نمایش(DisplayTemplate) تاریخ رو تبدیل میکنیم و بعد نشون میدیم و در ویرایش(EditorTemplate) هم به همین صورت اما فقط مقدار میلادی رو توی یک فیلد مخفی نگهداری میکنیم و بعد در زمان Submit اون مقدار رو ارسال میکنیم. خود این کارها واقعا وقت گیر، حوصله بر، دست و پاگیر و اضافی هست، البته در نهایت برای انتخاب تاریخ مجبوریم از یک DatePicker در EditorTemplate استفاده کنیم ولی همانطور که در ادامه میخونید دیگر نگرانی تبدیل اون از شمسی به میلادی رو در سمت کلاینت رو نخواهیم داشت.

به نظر من بهترین کار این هست که تمامی این تبدیل ها رو به قسمتی از سیستم بدیم و بزاریم خودش تشخیص بده و مدیریت کنه و ما هم این مشغله رو از ذهنمون دور بندازیم.

توی یکی از مطالبم مقدمه ای در مورد کالچر در Asp.net Web form و سیستم Blogengine نوشتم که از همون استراتژی هم میشه توی MVC استفاده کرد به هر حال هر دو زیرساخت Asp.net رو دارند اما فقط نحوه ی پیاده سازی برخی ساختارهای زیرین در دو تکنولوژی متفاوت هست.

بیشتر...

استفاده از ماژول Ninject.Extensions.Factory و الگوی Factory در زمان اعتبارسنجی Model در MVC

استفاده از الگوی Repository و پیاده سازی Dependency Injection با استفاده از کتابخانه ی Ninject برروی یک پروژه ی نسبتا بزرگ MVC بسیار کارامد خواهد بود.
به هرحال هر کدوم از این الگوها مزایای مربوط به خودش رو خواهد داشت. استفاده از الگوی اشاره شده به مراتب بیشتر از الگوهای دیگر در برنامه هایی که محوریت بیشتر آن برروی استفاده و تحلیل داده ها در بانک های اطلاعاتی هست می باشد، و استفاده از Ninject هم که مزایای خودش رو به این پروژه اضافه خواهد کرد.

بخش مهم اعتبارسنجی داده ها قبل از افزوده شدن به منبع ذخیره سازی نهایی مورد توجه است، در کلاس های Metadata که از طریق Attribute ها یا DataAnnotations اعتبار سنجی های اولیه صورت میگیرد زمانی نیاز به پیاده سازی یک اعتبارسنجی سفارشی و استفاده از Repository و استخراج داده های مورد نیاز به عنوان بخشی از این اعتبارسنجی می باشد. که متاسفانه عملیات ایجاد نمونه ی جدید کلاس Repository از طریق Field Injection یا هر نوع دیگری از Injection صورت نمی گیرد و با خطای null reference exception مواجه خواهید شد.

برای روشن کردن توضیحاتم یه مثال بزنم:
سناریویی رو در نظر بگیرید که در اون مشتری میخواد یک محصول رو خریداری کنه، اما باید بررسی بشه که اگر در لحظه ی خرید، تعداد محصول برابر با 0 هست پیغام خطای مناسب نمایش داده شود.
بنابراین ما یک کلاس Customer و یک کلاس Product که مربوط به اعتبارسنجی می باشد به شکل زیر خواهیم داشت،

بیشتر...