単純なスパムブロックのコードを再利用するためにActionFilter
を構築しています。基本的には、入力テキストボックスと非表示の入力をレンダリングするHtml Helper
メソッドがあり、ActionFilterにあります。 2つの値が同じかどうかを確認します。そうでない場合は、残りの検証ロジックを活用してModelStateError
をModelState
に追加したいのですが、どうすればよいですか? ModelStateError
からActionFilter
を追加するにはどうすればよいですか?
更新:これが私が試しているコードです。この属性を持つコントローラーアクションをテストすると、必要なフォーム値を渡さなくても、ModelState.IsValid
はtrue
を返します。
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var r = filterContext.HttpContext.Request;
if (r.Form["sixtimesnine"] != r.Form["fourtytwo"] || string.IsNullOrEmpty(r.Form["sixtimesnine"]) || string.IsNullOrEmpty(r.Form["fourtytwo"]))
{
filterContext.Controller.ViewData.ModelState.AddModelError("Spam", this.ErrorMessage);
}
base.OnActionExecuting(filterContext);
}
これはActionMethod
です:
[ValidateAntiSpam(ErrorMessage = "Spambotar får inte.")]
public ActionResult Write(GuestbookPost postToCreate)
{
if (ModelState.IsValid)
{
_posts.Add(postToCreate);
return RedirectToAction("Index");
}
return View();
}
OnActionExecuting
メソッド内にブレークポイントを設定して「デバッグテスト」を押すと、ブレークポイントがヒットしないことに気づきました。どうして?
それは次のようになります:filterContext.Controller.ViewData.ModelState