47

I'm building an ActionFilter to reuse some code for a simple spam block - basically what I do is that I have a Html Helper method that renders an input textbox and a hidden input, and in the ActionFilter I check whether the two values are the same or not. If not, I want to leverage the rest of my validation logic and add a ModelStateError to the ModelState, but how do I do that? How do I add a ModelStateError from whithin the ActionFilter?

UPDATE: Here's the code I'm trying with. When I test a controller action that has this attribute, ModelState.IsValid still returns true even though I don't pass any of the form values required:

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);
}

This is the ActionMethod:

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

I just noticed that if I set a breakpoint inside the OnActionExecuting method and hit "Debug tests", the breakpoint is never hit. Why?

Nathan Taylor
  • 24,423
  • 19
  • 99
  • 156
Tomas Aschan
  • 58,548
  • 56
  • 243
  • 402
  • The fact that your breakpoint is not being hit points to the solution why your filter doesn't work. Other action filters you wrote do work? Are you sure you haven't left out anything? – Gideon Jun 01 '09 at 11:01
  • Well, I'm not that sure since the code is not running. But I can't figure out what I could have left out... I seem to have done everything described here: http://msdn.microsoft.com/en-us/library/dd410056.aspx – Tomas Aschan Jun 01 '09 at 11:31

1 Answers1

99

That would be by: filterContext.Controller.ViewData.ModelState

Gideon
  • 18,251
  • 5
  • 45
  • 64