2013-05-29 29 views
14

Tôi có một móc api web pre-action sẽ kiểm tra ModelState.IsValid. Nếu ModelState không hợp lệ, tôi không muốn thực hiện hành động và chỉ trả lại tin nhắn của tôi ngay lập tức. Làm thế nào chính xác để tôi làm điều này?Web Api - cách dừng đường dẫn web trực tiếp từ Bộ lọc OnActionExecuting

public class ValidateModelStateAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext) { 
     if (!actionContext.ModelState.IsValid) 
     { 
      var msg = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState); 
      // Now What? 
     } 
     base.OnActionExecuting(actionContext); 
    } 
} 

Trả lời

28

thiết lập Response.Result. Nếu kết quả không phải là null, nó sẽ không thực thi hành động. cú pháp chính xác là thoát khỏi tôi ngay bây giờ, nhưng nó đơn giản như là

if(actionContext.ModelState.IsValid == false) 
{ 
     var response = actionContext.Request.CreateErrorResponse(...); 
     actionContext.Response = response; 
} 
+0

Tôi hiểu rồi, tôi có gọi là cơ sở hay không? Những gì tôi thực sự muốn là cho tất cả các bộ lọc hành động trước để chạy nhưng không phải là hành động. Bằng cách đó, bất kỳ bộ lọc ghi nhật ký nào sẽ vẫn chạy –

+0

có, bạn có thể gọi 'base' –

2

tôi đoán là bạn nên ném một HttpResponseException

+0

Bạn nghĩ điều đó sẽ hoạt động giống như chỉ trả lại tin nhắn? Không phải trong một nhà nước biên dịch vì vậy tôi không thể kiểm tra atm nhưng nó có vẻ lạ để ném ngoại lệ cho các vấn đề xác nhận. –

+0

@GeorgeMauer Nó sẽ làm việc cho ActionFilters, không chắc chắn về AuthorizationFilters. Như Joanna đề cập rõ ràng bạn cũng có thể chỉ cần thiết lập các phản ứng. Wow, tôi thực sự ghét ActionFilters, quá phức tạp không có lý do gì cả. –

+0

Ý của bạn là gì? Làm cách nào khác để bạn thực hiện các mối quan tâm chéo? Sử dụng các lớp cơ sở cho việc này thường biến thành một mớ hỗn độn không thể sửa đổi lớn khi bạn có đủ mối quan tâm xuyên suốt. Các tùy chọn khác chỉ kết thúc được một cái gì đó giống như PostSharp trong đó có máy chủ riêng của mình về các vấn đề. –

7

Bạn đã thực sự nhìn thấy ví dụ trên trang ASP.NET WebApi?

Trông rất giống với những gì bạn đang cố gắng để đạt được và tất cả họ làm là thiết lập các đáp ứng của đối tượng Context:

If model validation fails, this filter returns an HTTP response that contains the validation errors. In that case, the controller action is not invoked.

http://www.asp.net/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-api

see: Handling Validation Errors

+0

ah, không có tôi đã không nhìn thấy điều này. Cảm ơn. –

Các vấn đề liên quan