این سناریو رو در نظر بگیرید : کاربری به پنل کاربری خودش وارد شده و قصد داره اطلاعات شخصیش رو در 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 سال سابقه ی فعالیت های حرفه ای و آموزشی
زمان پاسخ گویی روز های شنبه الی چهارشنبه ساعت 9 الی 18
فقط به موضوعات مربوط به محصولات آموزشی و فروش پاسخ داده می شود