web-dev-qa-db-ja.com

ActionFilterからModelStateにアクセスするにはどうすればよいですか?

単純なスパムブロックのコードを再利用するためにActionFilterを構築しています。基本的には、入力テキストボックスと非表示の入力をレンダリングするHtml Helperメソッドがあり、ActionFilterにあります。 2つの値が同じかどうかを確認します。そうでない場合は、残りの検証ロジックを活用してModelStateErrorModelStateに追加したいのですが、どうすればよいですか? ModelStateErrorからActionFilterを追加するにはどうすればよいですか?

更新:これが私が試しているコードです。この属性を持つコントローラーアクションをテストすると、必要なフォーム値を渡さなくても、ModelState.IsValidtrueを返します。

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メソッド内にブレークポイントを設定して「デバッグテスト」を押すと、ブレークポイントがヒットしないことに気づきました。どうして?

44
Tomas Aschan

それは次のようになります:filterContext.Controller.ViewData.ModelState

90
Gidon