2016/03/18

[筆記] ASP.Net MVC 使用 ActionFilter 驗證 ModelState

利用 MVC 的 Model binding 時都要檢查 ModelState 是否有正確

 if (!ModelState.IsValid) return new HttpStatusCodeResult(HttpStatusCode.BadRequest) 


但每個 Action 都要記得這樣檢查實在是太累了 (而且有些人會忘記....)

所以直接做成 Filter 讓每個 request 都會執行這樣~

     public class ModelStateValidationFilter : System.Web.Mvc.ActionFilterAttribute
    {
        public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext)
        {
            if (!filterContext.Controller.ViewData.ModelState.IsValid)
            {
                var errors = from errs in (
                        from modelstate in filterContext.Controller.ViewData.ModelState.Values
                        select modelstate.Errors
                    )
                    where errs.Count > 0
                    select errs[0].ErrorMessage;

                // 用 Elmah 記錄誰在哪邊沒通過驗證
                Elmah.ErrorSignal.FromCurrentContext().Raise(new Exception(String.Join(",",errors.ToArray())));
                // 回應錯誤
                throw new HttpException(400);
            }

        }
    }


寫好之後要在 FilterConfig 中加入

    filters.Add(new ModelStateValidationFilter()); 

目前在寫的系統是用 Ajax From, 所以直接拋錯誤回去就可以 (讓 js 接手 on fail)

如果是重讀整個頁面的這樣就會直接讓 user 看到錯誤了~

沒有留言:

張貼留言