PDA

View Full Version : ارسال خطا



Future
شنبه 16 مرداد 1389, 06:33 صبح
سلام دوستان, من وقتی یه کلاس تعریف می کنم در همانجا از طریق یه exception خطا هاش رو بررسی می کنم.
مثل این مثال

public double Ass1
{
get { return Assignment1; }
set
{
if (value >= 0 && value <= 20)
{
Assignment1 = value;
}
else
{
throw new ArgumentException(string.Format("Error : value > 0 && value <= 20"));
}
}
}
حتی اگر یکی از مقادیر هم null باشه میشه اون رو کنترل کرد.



راستش توی یه مقاله من کد زیر رو دیدم که برای کنترل خطا استفاده کرد بود. یعنی برای Validate کردن
public class GuestResponse
{
[Required(ErrorMessage="Please enter your name")]
public string Name { get; set; }
[Required(ErrorMessage = "Please enter your email address")]
[RegularExpression(".+\\@.+\\..+",
ErrorMessage = "Please enter a valid email address")]
public string Email { get; set; }
[Required(ErrorMessage = "Please enter your phone number")]
public string Phone { get; set; }
[Required(ErrorMessage = "Please specify whether you'll attend")]
public bool? WillAttend { get; set; }
}

میشه بگید فرقشون چی هست؟

Rocker
شنبه 16 مرداد 1389, 07:20 صبح
public class GuestResponse
{
[Required(ErrorMessage="Please enter your name")]
public string Name { get; set; }
[Required(ErrorMessage = "Please enter your email address")]
[RegularExpression(".+\\@.+\\..+",
ErrorMessage = "Please enter a valid email address")]
public string Email { get; set; }
[Required(ErrorMessage = "Please enter your phone number")]
public string Phone { get; set; }
[Required(ErrorMessage = "Please specify whether you'll attend")]
public bool? WillAttend { get; set; }
}

اگه اینطوری کدها رو تگ CODE بزاری بهتر میشه خوندش

خوب یکی از فرقاش اینکه این کد میاد طبق الگویی که کاربر یه رشته رو وارد میکنه اون رو بررسی میکنه و اگه از یه ساختار مناسب برخوردار نبود بهش گیر میده.
مثلا میدونی که آدری ایمیل از یه قاعده ی خاصی پیروی میکنه شما تو کدت این رو بررسی نکردی اما اگر دقت کنی توی این کدی که گذاشتی با استفاده از دستور RegularExpression(".+\\@.+\\..+" این کار رو انجام میده.

BookWorm
شنبه 16 مرداد 1389, 07:21 صبح
سلام ، دوست عزیز فرق آنها در سمت اجرا شدن کدها است . سرور یا کلاینت ؟
Required ها در کلاینت اجرا می شوند و کد قبلی در سمت سرور . البته اگر من منظور شما را درست متوجه شده باشم .

Future
شنبه 16 مرداد 1389, 09:21 صبح
خب اگه من بخوام اون Exception رو که رخ میده در فرمم اجرا کنم باید چکار کرد. مثلا اگه کاربر در قسمت Name هیچی رو وارد نکرد. می خوام بجای اینکه با validation کنترلش کنم exception رو فعال کنم.

Rocker
شنبه 16 مرداد 1389, 09:34 صبح
خب اگه من بخوام اون Exception رو که رخ میده در فرمم اجرا کنم باید چکار کرد. مثلا اگه کاربر در قسمت Name هیچی رو وارد نکرد. می خوام بجای اینکه با validation کنترلش کنم exception رو فعال کنم.



Exception exp=new Exception("your exception message ");
if (1 == 1)
throw exp;


منظورم از 1==1 همون شرطیه که میخوای با برقرار شدنش استثنا رخ بده

Mostafa_Dindar
شنبه 16 مرداد 1389, 10:04 صبح
سلام ، دوست عزیز فرق آنها در سمت اجرا شدن کدها است . سرور یا کلاینت ؟
Required ها در کلاینت اجرا می شوند و کد قبلی در سمت سرور . البته اگر من منظور شما را درست متوجه شده باشم .

متاسفانه همچین حرفی کاملا اشتباه هست , اون موردی که شما مد نظرتون هست Required field validator هست .


سلام دوستان, من وقتی یه کلاس تعریف می کنم در همانجا از طریق یه exception خطا هاش رو بررسی می کنم.
مثل این مثال

public double Ass1
{
get { return Assignment1; }
set
{
if (value >= 0 && value <= 20)
{
Assignment1 = value;
}
else
{
throw new ArgumentException(string.Format("Error : value > 0 && value <= 20"));
}
}
}
حتی اگر یکی از مقادیر هم null باشه میشه اون رو کنترل کرد.



راستش توی یه مقاله من کد زیر رو دیدم که برای کنترل خطا استفاده کرد بود. یعنی برای Validate کردن
public class GuestResponse
{
[Required(ErrorMessage="Please enter your name")]
public string Name { get; set; }
[Required(ErrorMessage = "Please enter your email address")]
[RegularExpression(".+\\@.+\\..+",
ErrorMessage = "Please enter a valid email address")]
public string Email { get; set; }
[Required(ErrorMessage = "Please enter your phone number")]
public string Phone { get; set; }
[Required(ErrorMessage = "Please specify whether you'll attend")]
public bool? WillAttend { get; set; }
}

میشه بگید فرقشون چی هست؟

مورد دوم از Attribute ها استفاده میکند . Attribute ها کارایی بسیار زیادی دارند , در صورتی که از CodeGenerator های Template base مثل CodeSmith استفاده میکنید حتما از Attribute های استفاده کنید , چون به شدت میتونند به کارایی برنامه شما کمک کنند .

در مورد اینکه این Attribute ها چیکار میتونند انجام بدند ,کارهای بسیاری هست از جمله :

همانطور که میدونید Gridview خاصیتی به نام DataKeyName دارد که باید به Property کلید Object ست شده باشد . از اونجایی که ممکن است فراموش کنید , همیشه هنگامی Bussiness Object ها و بر اساس Entitiy های DataBase تولید میکنید , Attribute ای به نام DataKeyName رو هم ست کنید .

یعنی اضافه کردن Attribute زیر به بالای Property ای که کلید هست :

[DataObjectFieldAttribute(true)]

یا مواردی رو در نظر بگیرید که برای یک Controller در BLL چندین مورد متد برای اعمال CRUD نوشته اید .

با استفاده از Attribute ها میتونید نحوه نمایش اونها در ObjectDataSource رو کنترل کنید .

به عنوان نمونه:

[DataObjectMethod(DataObjectMethodType.Select, false)]

بحث رو کوتاه کنیم , استفاده از Attribute ها برای Validation هم کار جالبی هست که بهترین و کاملترین مقاله در این مورد رو برادر Imar نوشته :

Introducing the Validation Framework (http://imar.spaanjaars.com/477/n-layered-web-applications-with-aspnet-35-part-2-introducing-the-validation-framework) (7)
Advanced Validation Topics (http://imar.spaanjaars.com/478/n-layered-web-applications-with-aspnet-35-part-3-advanced-validation-topics) (8)


موفق باشید

Future
شنبه 16 مرداد 1389, 10:16 صبح
دوست عزیز خیلی ممنون از راهنمایی تون ولی وقتی من برنامه را اجرا می کنم اگر فیلد name خالی باشه پیغام خطایی صادر نمیشه روی صفحه ولی برنامه به خطی مراجعه می کنه که اون exception رخ داده. حالا برای اینکه این خطا روی صفحه ظاهر بشه آیا من نیاز به کنترل یا دستور خاصی دارم؟

Mostafa_Dindar
شنبه 16 مرداد 1389, 10:37 صبح
دوست عزیز خیلی ممنون از راهنمایی تون ولی وقتی من برنامه را اجرا می کنم اگر فیلد name خالی باشه پیغام خطایی صادر نمیشه روی صفحه ولی برنامه به خطی مراجعه می کنه که اون exception رخ داده. حالا برای اینکه این خطا روی صفحه ظاهر بشه آیا من نیاز به کنترل یا دستور خاصی دارم؟

دوست عزیز , شما مقاله رو به این زودی خوندی و تموم کردی ؟

یک کلاس Abstract بنام ValidationAttribute داریم که باید CustomAttribute ها رو از اون ارث بری کنیم . و پیاده سازی کنیم .

Required هم در کد شما باید CustomAttribute باشد که باید اون رو پیاده سازی کنید تا پیام خطا نمایش داده شود .

برای آشنایی با پیاده سازی CustomAttribute ها لطفا 2 مقاله بالا رو مطالعه بفرمائید .

مرسی