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 看到錯誤了~
沒有留言:
張貼留言