2009-06-01 8 views
31

간단한 스팸 차단을 위해 코드를 재사용하기 위해 ActionFilter을 구축하고 있습니다. 기본적으로 입력 텍스트 상자와 숨겨진 입력을 렌더링하는 Html Helper 메서드가 있고 ActionFilter에서 두 값이 같은지 확인합니다. 동일 또는 아닙니다. 그렇지 않은 경우 나머지 유효성 검사 로직을 활용하여 ModelStateErrorModelState에 추가하고 싶습니다. 어떻게해야합니까? ActionFilter에서 ModelStateError을 어떻게 추가합니까?ActionFilter에서 ModelState에 액세스하려면 어떻게합니까?

업데이트 : 다음은 내가 시도하고있는 코드입니다.

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

ActionMethod입니다 : :이 속성이 컨트롤러 액션을 테스트 할 때, ModelState.IsValid 아직도 내가 필요한 양식 값 중 하나를 통과하지 않더라도 true을 반환 단지

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

내가 중단 점을 OnActionExecuting 메서드 안에 넣고 "디버그 테스트"를 누르면 중단 점에 결코 도달하지 않는다는 것을 알게되었습니다. 왜?

+0

사실. 작성한 다른 작업 필터가 작동합니까? 당신은 아무것도 빠뜨리지 않았습니까? – Gidon

+0

글쎄, 나는 코드가 실행되고 있지 않다는 것이 확실하지 않다. 그러나 나는 내가 뺄 수있는 것을 알아낼 수 없다. 나는 여기에 설명 된 모든 것을 다한 것처럼 보인다 : http://msdn.microsoft.com/en-us/library/dd410056.aspx –

답변

73

가 될 것이라고 : 중단 점은 필터가 작동하지 않는 이유 솔루션에 체력을하지 않을 것을 filterContext.Controller.ViewData.ModelState

+1

나는 이것을 시도했지만, 그것은 작동하지 않는 것 같습니다. 내 게시물을 현재 가지고있는 코드로 업데이트했습니다. –

+1

이것이 실제로 내가 묻는 질문에 대한 대답이기 때문에 나는 그것을 믿을 것입니다. "새로운"문제로 새로운 질문을 열었습니다 ... –

+0

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

관련 문제