2009-06-01 9 views
31

Tôi đang xây dựng một ActionFilter để sử dụng lại một số mã cho khối spam đơn giản - về cơ bản những gì tôi làm là tôi có phương thức Html Helper hiển thị hộp nhập liệu và đầu vào bị ẩn và trong ActionFilter tôi kiểm tra xem hai giá trị đó có giống nhau hay không. Nếu không, tôi muốn tận dụng phần còn lại của logic xác thực của tôi và thêm ModelStateError vào ModelState, nhưng làm cách nào để làm điều đó? Làm cách nào để thêm một số ModelStateError từ whithin ActionFilter?Làm cách nào để truy cập vào ModelState từ một ActionFilter?

CẬP NHẬT: Đây là mã tôi đang thử. Khi tôi thử nghiệm một hành động điều khiển có thuộc tính này, ModelState.IsValid vẫn trả true mặc dù tôi không vượt qua bất kỳ giá trị hình thức yêu cầu:

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

Đây là ActionMethod:

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

Tôi chỉ nhận thấy rằng nếu tôi đặt điểm ngắt bên trong phương thức OnActionExecuting và nhấn "Kiểm tra gỡ lỗi", điểm ngắt không bao giờ được nhấn. Tại sao?

+0

Thực tế là breakpoint của bạn không được điểm nhấn với các giải pháp do tại sao bộ lọc của bạn không hoạt động. Các bộ lọc tác vụ khác bạn đã viết hoạt động? Bạn có chắc là bạn không bỏ sót điều gì không? – Gidon

+0

Vâng, tôi không chắc chắn vì mã không chạy. Nhưng tôi không thể tìm ra những gì tôi có thể đã bỏ ra ... Tôi dường như đã làm tất cả mọi thứ được mô tả ở đây: http://msdn.microsoft.com/en-us/library/dd410056.aspx –

Trả lời

73

Đó sẽ là bởi: filterContext.Controller.ViewData.ModelState

+1

Tôi đã thử điều này, nhưng nó dường như không hoạt động. Tôi đã cập nhật bài đăng của mình bằng mã tôi hiện có. –

+1

Vì đây thực sự là câu trả lời cho câu hỏi mà tôi đã hỏi, tôi sẽ tin bạn. Tôi đã mở một câu hỏi mới với sự cố "mới" ... –

+0

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