2009-06-01 25 views
31

Buduję ActionFilter, aby ponownie użyć kodu dla prostego bloku antyspamowego - w zasadzie to, co robię, to, że mam metodę Html Helper, która renderuje wejściowy tekst i ukryte dane wejściowe, aw ActionFilter I sprawdzam, czy te dwie wartości są to samo lub nie. Jeśli nie, chcę wykorzystać resztę logiki sprawdzania poprawności i dodać ModelStateError do ModelStateError do ModelState, ale jak mam to zrobić? Jak dodać urządzenie ModelStateError z urządzenia ActionFilter?Jak uzyskać dostęp do ModelState z ActionFilter?

AKTUALIZACJA: Oto kod, którego próbuję. Kiedy przetestować działanie kontrolera, który ma tą cechę, ModelState.IsValid nadal zwraca true choć nie przechodzą żadnej z wartości wymaganych formularzy:

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

To ActionMethod:

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

Właśnie zauważyłem, że jeśli ustawię punkt przerwania wewnątrz metody OnActionExecuting i kliknę "Testy debugowania", punkt przerwania nigdy nie zostanie trafiony. Czemu?

+0

Fakt, że nie jest przerwania punkty wytrzymałości do roztworu dlaczego filtr nie działa. Inne filtry akcji, które napisałeś, działają? Jesteś pewien, że niczego nie pominąłeś? – Gidon

+0

Cóż, nie jestem tego pewien, ponieważ kod nie jest uruchomiony. Ale nie mogę zrozumieć, co mogłem pominąć ... Wydaje mi się, że zrobiłem wszystko opisane tutaj: http://msdn.microsoft.com/en-us/library/dd410056.aspx –

Odpowiedz

73

To byłoby przez: filterContext.Controller.ViewData.ModelState

+1

Próbowałem tego, ale to nie działa. Zaktualizowałem swój post za pomocą kodu, który mam obecnie. –

+1

Jako że jest to właściwie odpowiedź na pytanie, które zadałem, za to ci zaufam. Otworzyłem nowe pytanie z "nowym" problemem ... –

+0

http://stackoverflow.com/questions/934647/why-do-none-of-my-actionfilters-run –

Powiązane problemy