بیایید یک مروری به ASP .NET MVC داشته باشیم تا با این موضوع بیشتر آشنا شويم. شما یک فرم ثبتنام دارید و قرار است این فرم، اطلاعاتی را به یک Action ارسال کند و بعد از تعیین اعتبار، روی دادهها عملیات انجام دهد.
کدزیر را در نظر بگیرید:
public ActionResult Create(Customer customer) {
if (ModelState .IsValid) {
db .Customers .Add(customer);
db .SaveChanges();return RedirectToAction(«Index»); }
return View(customer);}
این کد ابتدا دادهها را میگیرد و پس از اعتبارسنجی، اگر درست بود آنها را ذخیره میکند. اما این در حالت پیشفرض است. اگر شما دادهها را اشتباه بزنید؛ مثلا قرار است نام مشتری ۲۰ کاراکتر باشد شما ۳۰ کاراکتر بزنید ، پراپرتی ModelState .IsValid نتیجه درست را برمیگرداند و در نهایت دیتابیس به شما پیغام خطا میدهد. البته مثالی که زدیم، مثال راحتی است که میشود با یک if آن را به صورت زیر مدیریت کرد:
if (customer .Name .Length »20){
ModelState .AddModelError(«Name», «The name must be greater than 20 characters»);
return View(customer);}
خب پس براحتی مشکل حل میشود! اما ما قصد داریم راه سادهتری را برای حل این مشکل بیان کنیم و دیگر شما درگیر این if ها نشوید.
یک ویژگی در ASP .Net MVC 2 معرفی شد که شما با استفاده از فضای نام System.ComponentModel .DataAnnotations میتوانید براحتی دادههای خود را اعتبارسنجی کنید.
همانطور که در مقالههای پیش گفته شد یک بخش دادهای Model نام دارد، شما با اضافه کردن یکسری صفت (Attribute) به کلاس مدل خود، میتوانید این اعتبارسنجی را انجام دهید.
چند نمونه از این اعتبارسنجیها را مورد بررسی قرار میدهیم.
Required : مشخص میکند این ویژگی
Not NULL است، یعنی باید حتما مقدار داشته باشد و نمیتواند مقدار نگیرد.
StringLength : طول یک رشته را مشخص میکند و اگر بیشتر از آن بود ، پیغام خطا میدهد. (مثل مثال بالا).
Range : محدودهای برای مقدار یک ویژگی در نظر میگیرد، نمیگذارد مقدار آن خارج از آن بازه باشد.
RegularExpression : مقدار یک فیلد را با یک عبارت با قاعده بررسی میکند، اگر با هم یکسان بودند جواب درست برمیگرداند.
Key : مشخص میکند مقدار این ویژگی باید یکتا باشد.
حالا کلاس مدل زیر را در نظر بگیرید:
public class Customer { Key]
[Required] public int CustomerId { get; set; } Required]
StringLength(20)]
public string Name { get; set; }}
حالا آن if را که در بالا اضافه کردیم پاک میکنیم، این بار خطای زیر را به ما نمایش میدهد:
The field Name must be a string with a maximum length of 20 .
خب، اما ما نمیخواهیم این خطا را بدهد، این صفات که در بالا به آن اشاره شد این امکان را به ما میدهد که پیغام را خودمان تنظیم کنیم. به کد زیر دقت کنید:
[StringLength(20,ErrorMessage = «مقدار نام باید حداکثر ۲۰ کاراکترباشد»)]
public string Name { get; set; }
پیغام خطا به صورت زیر شد
مقدار نام باید حداکثر ۲۰ کاراکتر باشد
اما باز آن چیزی که مد نظر ماست حاصل نشده است. فرض کنید سایت شما چند زبانه است، در این صورت این پیغام فارسی منطقی به نظر نمیرسد یا این که بعدا بخواهید پیغامهای خطای خود را عوض کنید، در آن صورت باز هم کار سختی در پیش دارید، به عبارتی یک برنامه بزرگ با پیغامهای خطای زیادی که باید همگی اصلاح شوند. در این شرایط استفاده از Resource ها میتواند کمک بزرگی به شما کند.
با استفاده از Resourceها علاوه بر این که میتوانید بر پیغامهای خود مدیریت سادهتری داشته باشید، در صورت چند زبانه بودن سایت نیز با مشکل مواجه نمیشوید.
اما چگونه پیغامهای خطای خود را در یک فایل Resource قرار دهیم؟
جواب ساده است، ابتدا برای این که ساختار پروژه و نظمی که دارد از بین نرود، یک پوشه با نام Resources ساخته، سپس روی آن راست کلیک کنید و گزینه Add new item را انتخاب کنید، از پنجره باز شده گزینه Resources file را انتخاب کنید. در پنجره باز شما میتوانید یک کلید وارد کنید که مشخص کننده نام پیغام است و مقدار آن، به طور مثال
Name : CustomerName
نام حداکثر ۲۰ کاراکتر میتواند باشد. :Value
بعد از ذخیرهکردن تغییرات، روی فایلی که ساختید راست کلیک کرده و Properties را انتخاب کنید. در پنجره Properties مقدار Custom Tool را برابر PublicResXFileCodeGenerator قرار دهید و بعد از ذخیرهکردن تغییرات به کلاس Customer که یک مدل است بروید و ویژگی Name را به صورت زیر بازنویسی کنید.
Required] StringLength(20,
ErrorMessageResourceType=typeof(ErrorMessage), ErrorMessageResourceName=»CustomerName»)]
public string Name { get; set; }
از این به بعد وقتی مقدار Name کوچکتر بود، برای نمایش پیغام خطا به سراغ فایل Resource که ساختید رجوع میکند و مقدار CustomerName را به عنوان پیغام خطا نمایش میدهد.
در شماره بعدی، این مبحث را بیشتر باز خواهیم کرد و نحوه تعریف Custom Validator ها (اعتبارسنجیهای سفارشی) را بررسی میکنیم.
اميربهاءالدين سبطالشيخ