علی شکرالهی
بنیانگذار توسینسو و توسعه دهنده

آموزش حذف فیلدهای Validate شده از ModelState

این سناریو رو در نظر بگیرید : کاربری به پنل کاربری خودش وارد شده و قصد داره اطلاعات شخصیش رو در Action یی با نام ChangeInfo تغییر بده .مدل مورد استفاده ی ما در View به شکل زیر تعیین شده :

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران
public class Member
    {
        public long Id { get; set; }

        [Required(AllowEmptyStrings = false,ErrorMessage = "نام کاربری خود را وارد نمایید.")]
        public string Username { get; set; }

        [Required(AllowEmptyStrings = false, ErrorMessage = "کلمه عبور خود را وارد نمایید.")]
        public string Password { get; set; }

        [Required]
        public string PasswordSalt { get; set; }


        [Required(AllowEmptyStrings = false, ErrorMessage = "ایمیل خود را وارد نمایید.")]
        [RegularExpression(Constants.EmailValidationRegularExpression,ErrorMessage = "ایمیل وارد شده معتبر نمی باشد.")]
        public string Email { get; set; }
    }

متناسب با DataAnnotation های استفاده شده، اگر کاربر برفرض مثال صرفا قصد داشته باشه که ایمیلش رو تغییر بده و سایر پارامترها مثل Password رو تغییر نده ، در هنگام Post کردن اطلاعات اگر با استفاده از ModelState.IsValid ، مدل رو اعتبارسنجی کنیم خروجی False خواهد بود.در صورتی که ما قصد داشتیم تا صرفا کاربر اطلاعاتش رو بتونه ویرایش کنه ، حالا میتونه ایمیلش رو ویرایش کنه یا کلمه عبور یا هیچکدام .در ASP.NET MVC مکانیزمی وجود نداره که در یک View خاص ، Validation رو غیر فعال کنیم . (دقت کنین برای یک View خاص ، ولی میشه برای یک Type خاص Validation رو با استفاده از ModelBinder غیرفعال کرد) .راه کاری که من برای این مسئله پیاده کردم ، نوشتن یک ActionFilter بود که قبل از Execute شدن Action عمل میکنه . کد این Action به شکل زیر تعریف شده :

public class PreventValidationAttribute : ActionFilterAttribute
    {
        private readonly string[] _excludeProperties;

        public PreventValidationAttribute(params string[] excludeProperties)
        {
            _excludeProperties = excludeProperties;
        }

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var modelState = filterContext.Controller.ViewData.ModelState;
            if (modelState == null)
                return;

            if (_excludeProperties == null || !_excludeProperties.Any())
                return;

            foreach (var excludeProperty in _excludeProperties)
            {
                modelState.Remove(excludeProperty);
            }
        }

مطابق Filter بالا ، نام پراپرتی های ارسال شده به Filter از ModelState حذف میشن و از این طریق دیگه در View مشکلی در اعتبارسنجی اطلاعات پیش نمیاد .

با آرزوی موفقیت ...

نویسنده: علی شکرالهی

منبع: جزیره برنامه نویسی وب سایت توسینسو

هرگونه نشر و کپی برداری بدون ذکر منبع دارای اشکال اخلاقی است


علی شکرالهی
علی شکرالهی

بنیانگذار توسینسو و توسعه دهنده

علی شکرالهی، بنیانگذار TOSINSO ، توسعه دهنده وب و برنامه نویس موبایل، مهندسی نرم افزار از دانشگاه آزاد اسلامی واحد کرج ، بیش از 15 سال سابقه ی فعالیت های حرفه ای و آموزشی

نظرات