View Full Version : گفتگو: اعتبار سنجی
aghayex
جمعه 14 تیر 1392, 10:10 صبح
با سلام
دوستان من در برنامم می خوام یه اعتبار سنجی خوبی داشته باشم برا همین یه سورس تو جستجوها پیدا کردم که لینکش در پایین گذاشتم . در این سورس کد دو پروژه هم با wpf و هم با sl گذلشته هر کدوم ازشون به یه پروژه از نوع dll شاره می کنه در حالا در این کلاس های dll برا بحث اعتبار سنجی کلاس های متفاوتی ساخته شده .
حالا سوال من اینه که با توجه به کلاس های خود دات نت آیا لزومی داشته که این کار شده یا نه ؟
http://mvvmvalidation.codeplex.com/releases/view/78335
it.developer
شنبه 15 تیر 1392, 15:36 عصر
یک توصیه مهم :
در پروژه های مبتنی بر سیلورلایت تا سرحد ممکن از افزودن dll های جانبی اضافی به پروژه سیلورلایتتون اجتناب کنید ، چراکه منجر به افزایش حجم فایل Xap میشه و در طولانی مدت بر performance پروژه ات تاثیر میذاره. بنابراین تا سرحد ممکن با افزودن dll های جانبی از بزرگ شدن بی رویه فایل xap اتون جلوگیری کنید و گرنه در زمان استقرار سیستم این بزرگی فایل اذیتت میکنه.
اما اصل ولیدیشن:
اول اینکه این نمونه کدی که لینکش را دادی مبتنی بر MVVM هستش ، بنابراین اگر ساختار پروژه ات مبتنی بر این تمپلیت هست سراغش برو.
دوم اینکه میتونی فقط با افزودن دو فایل .cs به پروژه سیلورلایتت امکان Client side validation را به راحتی پیدا کنی ، فقط با چند خط کد ! البته اگه کمی زمان بذاری میتونی به راحتی توسعه اش بدی و حرفه ای ترش کنی . در هر حال من چیزهای زیادی برای ولیدیشن سیلورلایت توی اینترنت دیدم ولی این مورد به دلیل عدم نیاز به طراحی خاص و یا dll خاصی و به کمک چند خط کد کمکت میکنه تا ولیدیشن داشته باشی فقط برای بقیه کنترلهات باید توسعه اش بدی.
یه فایل cs بساز با نام CustomValidation و محتوای زیر :
namespace yourprojcectname
{
public class CustomValidation
{
#region Private Members
private string message;
#endregion
#region Properties
public bool ShowErrorMessage
{
get;
set;
}
public object ValidationError
{
get
{
return null;
}
set
{
if (ShowErrorMessage)
{
throw new ValidationException(message);
}
}
}
#endregion
#region Constructor
public CustomValidation(string message)
{
this.message = message;
}
#endregion
}
}
خوب در مرحله بعد یه فایل دیگه اضافه کن با نا م Extensions و محتوای زیر:
public static class Extensions
{
public static void SetValidation(this FrameworkElement frameworkElement, string message)
{
CustomValidation customValidation = new CustomValidation(message);
Binding binding = new Binding("ValidationError")
{
Mode = System.Windows.Data.BindingMode.TwoWay,
NotifyOnValidationError = true,
ValidatesOnExceptions = true,
Source = customValidation
};
frameworkElement.SetBinding(Control.TagProperty, binding);
}
public static void RaiseValidationError(this FrameworkElement frameworkElement)
{
BindingExpression b = frameworkElement.GetBindingExpression(Control.TagP roperty);
if (b != null)
{
((CustomValidation)b.DataItem).ShowErrorMessage = true;
b.UpdateSource();
}
}
public static void ClearValidationError(this FrameworkElement frameworkElement)
{
BindingExpression b = frameworkElement.GetBindingExpression(Control.TagP roperty);
if (b != null)
{
((CustomValidation)b.DataItem).ShowErrorMessage = false;
b.UpdateSource();
}
}
public static bool IsTextValid(this string inputText)
{
bool isTextValid = true;
foreach (char character in inputText)
{
if (char.IsWhiteSpace(character) == false)
{
if (char.IsLetterOrDigit(character) == false)
{
if (CharUnicodeInfo.GetUnicodeCategory(character) != UnicodeCategory.NonSpacingMark)
{
isTextValid = false;
break;
}
}
}
}
return isTextValid;
}
public static bool IsNumberValid(this string inputNumber)
{
bool isNumberValid = true;
foreach (char character in inputNumber)
{
if (! char.IsDigit(character))
{
isNumberValid = false;
break;
}
}
return isNumberValid;
}
public static bool IsEmailValid(this string inputEmail)
{
bool isEmailValid = true;
string emailExpression = @"^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$";
Regex re = new Regex(emailExpression);
if (!re.IsMatch(inputEmail))
{
isEmailValid = false;
}
return isEmailValid;
}
}
ضمن اینکه namespace فایلت را global در نظر بگیری تا در کل پروژه ات از طریق namespace پیش فرض پروژه ات قابل دسترس باشه.
خوب حالا بعد از build پروژه ات برو سراغ یکی از فرم هات که توش تکست باکست را میخوای ولیدیت کنی و به طور مثال من کد زیر را برای فرم لاگین در نظر میگیرم :
private void btnLogin_Click(object sender, RoutedEventArgs e)
{
#region ' Check Validation '
bool isPageValid = true;
#region ' Clear Current Validator Error '
txtBxUserName.ClearValidationError();
txtBxPassword.ClearValidationError();
#endregion ' Clear Current Validator Error '
#region ' Validations '
if (txtBxUserName.Text == string.Empty)
{
txtBxUserName.SetValidation("Please enter a valid user name");
txtBxUserName.RaiseValidationError();
isPageValid = false;
}
if (txtBxPassword.Password == string.Empty || txtBxPassword.Password.Length < 6)
{
txtBxPassword.SetValidation("Please enter a valid password (At least 6 characters or more)");
txtBxPassword.RaiseValidationError();
isPageValid = false;
}
if (isPageValid == false) return;
#endregion ' Check Validation '
#region ' Call Service '
#endregion ' Call Service '
}
اگه به کد اولیه توجه کنی برای تکست باکست میتونی سه نوع ولیدیشن داشته باشی که اگه زمان بذاری میتونی خیلی زیاد توسعه اش بدی. در حال حاضر ولیدیشن اعداد ، ایمیل و متن هستش ولی در حد ساده که اگه یکی دو ساعت زمان بذاری میتونی کلی بهش چیزی اضافه کنی و من فقط ساختار کلی را بهت پیشنهاد دادم دوست عزیز.
aghayex
یک شنبه 16 تیر 1392, 05:51 صبح
تشکر صحبت های شما بجا و مفید بود
حالا اگه این سورس کد رو در wpf کار ببریم چطور ؟
it.developer
دوشنبه 17 تیر 1392, 18:23 عصر
در اونجا هم میتونی استفاده کنی . البته من تستش نکردم ولی مسلما چون مبنای بیشتر کد سرور ساید هستش و مبتنی بر C# و کمتر xaml درگیر شده ، باید بتونی از این نمونه در wpf استفاده کنی
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.