如何从ActionFilter访问ModelState?

Tom*_*han 42 asp.net-mvc modelstate action-filter

我正在构建一个ActionFilter重用一些代码用于简单的垃圾邮件块 - 基本上我所做的是我有一个Html Helper方法来呈现输入文本框和一个隐藏的输入,并在ActionFilter中我检查这两个值是否相同.如果没有,我想利用我的验证逻辑的其余部分并添加一个ModelStateErrorModelState,但我怎么做呢?如何添加一个ModelStateError来自whithin 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);
}
Run Code Online (Sandbox Code Playgroud)

这是ActionMethod:

[ValidateAntiSpam(ErrorMessage = "Spambotar får inte.")]
public ActionResult Write(GuestbookPost postToCreate)
{
    if (ModelState.IsValid)
    {
        _posts.Add(postToCreate);
        return RedirectToAction("Index");
    }
    return View();
}
Run Code Online (Sandbox Code Playgroud)

我只是注意到,如果我在OnActionExecuting方法中设置了一个断点并点击"Debug tests",那么断点就永远不会被击中.为什么?

Gid*_*don 87

那将是: filterContext.Controller.ViewData.ModelState