views:

254

answers:

1

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?

+6  A: 

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

Gidon
I tried this, but it does not seem to work. I've updated my post with the code I have currently.
Tomas Lycken
As this is actually the answer to the question I asked, I'll cred you for it. I've opened a new question with the "new" problem...
Tomas Lycken
http://stackoverflow.com/questions/934647/why-do-none-of-my-actionfilters-run
Tomas Lycken