خصوصیت RegularExpression و خصوصیت Compare – جلسه ۴۰

RegularExpression Attribute & Compare Attribute - Session 40

در این جلسه از آموزش ASP.NET 5.0 / Core قصد داریم تا به معرفی خصوصیت RegularExpression و خصوصیت Compare بپردازیم و از این دو خصوصیت در پروژه خود استفاده نماییم. اگر با Regular Expression آشنایی ندارید، میتوانید توضیحات تکمیلی این مبحث را در سایت میکروسافت که در این قسمت قابل دسترس میباشد مشاهده نمایید. همچنین شما میتوانید Regular Expressionهای پرکاربرد را در سایت Regular Expression Library جستجو نمایید و در پروژه های خود استفاده نمایید. ضمنا، امکان تست عبارات باقاعده در سایت Rubular میسر میباشد که به شما این امکان را میدهد که قبل از استفاده از آن عبارت در پروژه خود، نسبت به تست آن اقدام نمایید.

Regular Expression و یا عبارات باقاعده در سی‌شارپ چیست؟

عبارات باقاعده یک متد موثر، قدرتمند و انعطاف‌پذیر برای پردازش رشته‌ها میباشد. در سی‌شارپ، عبارات باقاعده (Regular Expression) یک الگو برای تجزیه و تحلیل یک رشته میباشند که مشخص می‌کنند آیا متن وارد شده از الگو مورد نظر ما پیروی میکند یا خیر. به طور کلی به عبارات باقاعده در سی‌شارپ C# Regex گفته میشود. همچنین فریمورک .NET یک موتور برای عبارات باقاعده ارائه داده است که وظیفه تجزیه متن و مطابقت با الگو را انجام میدهد.

خصوصیت RegularExpression در ASP.NET 5.0 / Core

همانگونه که شرح داده شد، این خصوصیت برای اعمال الگو خاص بروی متون ورودی میباشد. در واقع متون ورودی توسط خصوصیت RegularExpression بررسی میگردند که آیا از الگو مورد نظر ما پیروی میکند یا خیر. در صورت رعایت الگو، خطای اعتبارسنجی رخ نخواهد داد ولی در صورت عدم رعایت الگو ModelStatus.IsValid مقدار False را برمیگرداند و خطای اعتبارسنجی رخ خواهد داد.

این خصوصیت مانند دیگر خصوصیت های Model ویا ViewModel در فضای نام System.ComponentModel.DataAnnotations قراردارد و در صورت نیاز به استفاده، باید به کلاس مربوطه اضافه گردد. این خصوصیت، عبارت باقاعده مورد نظر را به صورت یک رشته دریافت میکند. همچنین امکان شخصی‌سازی پیام خطا با پارامتر ErrorMesage نیز میسر میباشد.

جهت جلوگیری از کامپایل معنای بک اسلش \ در عبارات باقاعده، میبایست در ابتدای عبارت و قبل از بازنمودن دبل کوتیشن ” از کاراکتر @ استفاده نمود.

    public class CreateCostViewModel
    {
        [RegularExpression(@"^?\d+(\.\d{2})? *?$", ErrorMessage = "The amount should be in digits with maximum of 2 decimal")]
        public decimal Amount { get; set; }
        public DateTime Date { get; set; }
        [RegularExpression(@"^(\w*\ *\.*\-*\\*\/*)*$", ErrorMessage = "Comment does not accept some special characters")]
        public string Comment { get; set; }
        public string Category { get; set; }
        public List<SelectListItem> Categories { get; set; }
        public List<string> SelectedCategories { get; set; }
        public int PaymentMethod { set; get; }
        public List<PaymentMethod> PaymentMethods { get; set; }
        public bool MakeFormClear { get; set; }
    }

همانگونه که در مثال فوق مشاهده مینمایید، خصوصیت RegularExpression بروی دو فیلد Amount و Comment اعمال گردیده است.

خصوصیت Compare در ASP.NET 5.0 / Core

همانگونه که از نام این خصوصیت مشخص است، برای مقایسه مقدار دو فیلد به کار میرود. اصولا این Attribute برای مقایسه کلمه عبور با فیلد تایید کلمه عبور و یا مقایسه ایمیل در فیلد تایید ایمیل در فرمهای ثبت‌نام مورد استفاده قرار میگیرد. این خصوصیت در فضای نام System.ComponentModel.DataAnnotations قراردارد و در صورت نیاز به استفاده باید به کلاس مربوطه اضافه گردد.

این خصوصیت باید بروی فیلد تاییدیه مانند Confirm Password و یا Confirm Email قرار گیرد و نام فیلدی که میبایست با این فیلد مقایسه گردد به صورت رشته‌ایی در این خصوصیت قرار میگیرد. همچنین امکان شخصی‌سازی پیام خطا با پارامتر ErrorMesage نیز میسر میباشد.

عملیات مقایسه در خصوصیت Compare به صورت Case Sensitive میباشد و حروف بزرگ و کوچک با هم یکسان نمیباشند. به عنوان مثال عبارت No Comment و no comment با هم برابر نمیباشند.

    public class CreateCostViewModel
    {
        public decimal Amount { get; set; }
        public DateTime Date { get; set; }
        public string Comment { get; set; }
        [Display(Name = "Confirm Comment")]
        [Compare("Comment", ErrorMessage = "Mismatched value, Comment & Cofirm Comment should be the same")]
        public string ConfirmComment { get; set; }
        public string Category { get; set; }
        public List<SelectListItem> Categories { get; set; }
        public List<string> SelectedCategories { get; set; }
        [Display(Name ="Payment Method")]
        public int PaymentMethod { set; get; }
        public List<PaymentMethod> PaymentMethods { get; set; }
        public bool MakeFormClear { get; set; }
    }

همانگونه که در قطعه کد فوق مشاهده میکنید، خصوصیت Compare بروی فیلد تازه ایجاد شده ConfirmCompare اعمال گردیده است و وظیفه مقایسه متن ورودی دو فیلد Comment و ConfirmComment را برعهده دارد. همچنین میبایست فیلد اضافه شده را به نمای خود (CreateStronglyTypedView.cshtml) نیز اضافه نماییم.

@model CreateCostViewModel

@{
    ViewBag.Title = "Create New Cost Record";
}

<div class="row">
    <div class="alert alert-primary col-lg-6 offset-lg-3 mt-5" role="alert">
        <h2>Create Cost Record</h2>
    </div>
    @using (Html.BeginForm("CreateStronglyTypedView", "Cost", FormMethod.Post, new { @class = "col-lg-6 offset-lg-3 border border-1" }))
    {
        <div>
            @Html.LabelFor(m => m.Amount, new { @class = "form-lable" })
            @Html.TextBoxFor(m => m.Amount, new { @class = "form-control" })
            @Html.ValidationMessageFor(m => m.Amount, "", new { style = "color:red" })
        </div>
        <div>
            @Html.LabelFor(m => m.Date, new { @class = "form-lable" })
            @Html.TextBoxFor(m => m.Date, new { @class = "form-control" })
            @Html.ValidationMessageFor(m => m.Date, "", new { style = "color:red" })
        </div>
        <div>
            @Html.LabelFor(m => m.Category, new { @class = "form-lable" })
            @Html.DropDownListFor(m => m.Category, Model.Categories, "Select a Category", new { @class = "form-control" })
        </div>
        <div>
            @Html.ListBoxFor(m => m.SelectedCategories, Model.Categories, new { @class = "form-select" })
        </div>
        <div>
            @Html.LabelFor(m => m.Comment, new { @class = "form-lable" })
            @Html.TextAreaFor(m => m.Comment, new { @class = "form-control" })
            @Html.ValidationMessageFor(m => m.Comment, "", new { style = "color:red" })
        </div>
        <div>
            @Html.LabelFor(m => m.ConfirmComment, new { @class = "form-lable" })
            @Html.TextAreaFor(m => m.ConfirmComment, new { @class = "form-control" })
            @Html.ValidationMessageFor(m => m.ConfirmComment, "", new { style = "color:red" })
        </div>
        <div>
            @Html.Label("PaymentMethods", "Payment Methods", new { @class = "form-lable" })
            @foreach (var PM in Model.PaymentMethods)
            {
                <div class="form-check">
                    @Html.RadioButtonFor(m => m.PaymentMethod, PM.ID, new { @class = "form-check-input" }) @PM.Method
                </div>
            }
        </div>
        <div class="form-check">
            @Html.CheckBoxFor(m => m.MakeFormClear, new { @class = "form-check-input" }) Make Form Clear after Submission
        </div>
        <div class="mt-2">
            <button type="submit" class="btn btn-primary btn-block mb-1">Create</button>
        </div>
    }

</div>

در صورت نیاز به جزئیات بیشتر، میتوانید ویدئو آموزشی این جلسه را تماشا نمایید. همچنین برای آگاهی از جلسات بعدی این دوره آموزشی، ما را در اینستاگرام، تلگرام، یوتیوب و آپارات دنبال کنید. ضمنا لیست کامل جلسات در این قسمت در دسترس شما میباشد و سورس کد این جلسه را میتوانید از GitHub ما دانلود نمایید.

تماشای ویدیو در یوتیوب ما

دانلود اسلایدهای آموزشی این جلسه از اینجا

برچسب ها

0 0 رای ها
امتیازدهی به مقاله
اشتراک در
اطلاع از
guest
0 نظرات
بازخورد (Feedback) های اینلاین
مشاهده همه دیدگاه ها
0
افکار شما را دوست داریم، لطفا نظر دهید.x