PDA

View Full Version : اعتبار سنجی مدل با کمک فیلتر



hakim22
شنبه 28 مهر 1397, 13:54 عصر
در ASP.NET Core MVC معمولا از ModelState.IsValid برای بررسی معتبر بودن مدل استفاده می کنیم. مشکل این است که باید این چک را درون همه ی اکشن ها انجام دهیم و برای مسیر های مختلف از دستورات شرطی استفاده کنیم.


[HttpPost]
public IActionResult Create(Movie model)
{
if (ModelState.IsValid)
{
// Save changes
return RedirectToAction(nameof(Index));
}
else
{
return View(model);
}
}


این کد تنها روی یک متد کار میکند و اگر در جاهای دیگر پروژه هم نیاز به اعتبار سنجی داشته باشید (که همیشه داریم) باید دوباره دستور شرطی را برای ModelState پیاده کنیم.

راه ساده تر این است که مکانیزم کنترل اعتبار سنجی را با کمک یک اکشن فیلتر پیاده کنیم. یک فیلتر در ASP.NET Core می تواند در مسیر اکشن قرار گیرد و وضعیت ModelState را بررسی کند. سپس می توانیم فیلتر را روی یک اکشن یا کل متدهای یک کنترلر اعمال کنیم یا آن را به صورت فیلترهای گلوبال در همه ی پروژه فعال کنیم. دیگر نیاز به پیاده سازی شرط ModelState در کل پروژه نخواهیم داشت.



internal class ValidateModelAttribute : Attribute, IActionFilter
{
public void OnActionExecuted(ActionExecutedContext context)
{
// No action
}

public void OnActionExecuting(ActionExecutingContext context)
{
if (!context.ModelState.IsValid)
{
var ctrl = (Controller)context.Controller;

var view = new ViewResult
{
ViewName = context.RouteData.Values["Action"].ToString(),
ViewData = ctrl.ViewData
};

context.Result = view;
}
}
}


در این فیلتر ما ابتدا وضعیت ModelState را چک می کنیم. در صورتی که IsValid درست نباشد کاربر باید به فرم ورود Redirect شود. برای پیدا کردن ویوی مروبوطه از Context استفاده شده است.


بعد از تعریف فیلتر کد ما به صورت زیر تغییر میکند.


[HttpPost]
[ValidateModel]
public IActionResult Create(Movie model)
{
// Save changes
return RedirectToAction(nameof(Index));
}



سورس کامل این برنامه را می توانید از GitHub دانلود کنید (https://github.com/codehaks/ValidateModel). راه ساده تر این است که این فیلتر را از طریق Nuget نصب کنید (https://www.nuget.org/packages/Codehaks.Common).
کافی است در Package Manager Console دستور زیر را اجرا کنید :


Install-Package Codehaks.Common

Moien Tajik
شنبه 28 مهر 1397, 14:19 عصر
البته با استفاده از ApiController و قراردادن این Attribute بالای نام Controller ، عمل ModelState Validation + یک سری کارهای دیگه بصورت خودکار و بدون پکیج های جانبی انجام میشه که نوع Response در صورت رخ دادن ارور رو هم میشه داخل Startup.cs تغییر داد :
https://www.strathweb.com/2018/02/exploring-the-apicontrollerattribute-and-its-features-for-asp-net-core-mvc-2-1/