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?
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
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 –