מדריך ASP.NET MVC – שימוש ב- GlobalFilter
בפרק הקודם הגדרנו Filter חדש והשתמשנו בו על פני כמה Actions שונים. במידה ורוצים לשייך Filter מסוים עם כל ה-Controllers בתוכנית מבלי שנצטרך להגדיר אותו על כל מחלקה בנפרד ניתן להשתמש בשיטת רישום מיוחדת דרך קובץ ה-Global.asax.cs.
Filter אשר נרשם באופן שכזה נקרא Global Filter.
להורדת הקוד של הפרק הקודם לחץ כאן
פתח את הקובץ Global.asax.cs ובחן את הפונקציה RegisterGlobalFilters:
public static void RegisterGlobalFilters(
GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
ניתן לראות כי הקוד רושם Filter מסוג HandleErrorAttribute.
Filter זה הינו מוגדר ע"י ASP.NET MVC והוא מממש את הממשק IExceptionFilter ולכן יופעל בכל פעם שתיזרק שגיאה בזמן טיפול ב-Action מסוים. באותו אופן ניתן לרשום Filters אחרים שמימשת בעצמך.
ה-HandleError Filter בודק האם האופציה "customErrors" תחת הקובץ web.config דלוקה, ובמידה וכן מפנה את המשתמש לתצוגת שגיאה בשם "Error".
על מנת לחוות את ההתנהגות של Filter זה עליך תחילה לדמות שגיאה בקוד. לדוגמא, עדכן את ה-Create Action תחת המחלקה GroupController באופן הבא:
[HttpGet]
[AuthorizeEx(Roles = "admin")]
public ActionResult Create(int parentId)
{
throw new Exception("Internal error");
...
}
שים לב כיצד ה-Action זורק שגיאה באופן מכוון.
בנוסף, יש לעדכן את קובץ הקונפיגורציה Web.config באופן הבא:
<configuration>
<system.web>
<customErrors mode="On">
</customErrors>
...
</configuration>
כאמור, ה-HandleError Filter מפנה את המשתמש לתצוגה בשם "Error". תצוגה זו כבר קיימת בפרויקט והיא נוצרה מראש ע"י Visual Web Developer. פתח את הקובץ Views\Shared\Error.cshtml וערוך אותו באופן הבא:
@{
ViewBag.Title = "Internal Error";
}
<div class="internalError">
<hr />
Sorry, an error occurred while processing your request.
</div>
הרץ את התוכנית וודא כי שגיאה מסודרת מדווחת למשתמש כאשר הוא מנסה ליצור קבוצה חדשה (יש להיכנס למערכת תחת המשתמש roni):
בפרק זה למדנו כיצד לרשום Filter כגלובלי. פילטר שכזה מקבל הזדמנות לטפל בכל בקשה שמגיעה לשרת ולכן משמש ככלי חשוב בבנייה של תשתיות.
תגובות בפייסבוק