5

Tôi đã thiết lập nhà cung cấp tùy chỉnh để cho phép đặt thuộc tính xác thực từ kho dữ liệu thay vì trong mã tĩnh. Hoạt động tốt với việc xác thực phía máy khách trong dự án .NET MVC 4 của tôi, nhưng tôi không thể nhận được xác thực hợp lệ phía máy chủ để làm việc.Xác thực phía máy chủ với tùy chỉnh DataAnnotationsModelValidatorProvider

CustomModelValidatorProvider cs:

 

    public class CustomModelValidatorProvider : DataAnnotationsModelValidatorProvider 
    { 
     protected override IEnumerable GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable attributes) 
     { 
      // set attributes from datastore here 

      return base.GetValidators(metadata, context, attributes); 
     } 
    } 

Trong Global.asax.cs của tôi, tôi có:

 

    protected void Application_Start() 
    { 
     ModelValidatorProviders.Providers.Clear(); 
     ModelValidatorProviders.Providers.Add(new CustomModelValidatorProvider()); 
    } 

Và trong một phương thức web API tôi có:

 

    var validationResultList = new List(); 
    bool valid = Validator.TryValidateObject(myModelObject, new ValidationContext(myModelObject, null, null), validationResultList, true); 

Ở đây, hợp lệ luôn đúng. Ngay cả khi xác thực bên máy khách Jquery hiển thị lỗi. Về phía máy chủ, nhà cung cấp tùy chỉnh của tôi không được sử dụng để áp dụng chú thích dữ liệu. Khi tôi đặt một breakpoint trong GetValidators() nó được gọi khi View được tạo và hiển thị chính xác các trình duyệt tính hợp lệ của phía máy khách, nhưng không được gọi lại khi mô hình được gắn kết với bộ điều khiển.

Tôi đã bỏ lỡ một bước chưa? Bất kỳ trợ giúp nào cũng được đánh giá rất cao!

CẬP NHẬT

Các validator tùy chỉnh hoạt động chính xác khi đối tượng được đưa lên một Controller, nhưng không bị sa thải khi được đưa lên một ApiController.

+0

xin lỗi tôi đã đăng nhận xét trong câu hỏi khác không nhận ra đây là câu hỏi của bạn! Từ những gì tôi biết bộ điều khiển API và bộ điều khiển tiêu chuẩn sử dụng bộ kết nối mô hình riêng biệt để vấn đề có thể xuất phát từ việc không thêm đúng trình xác nhận hợp lệ vào bộ mô hình chính xác. Hiện tại không có máy tính của tôi nhưng tôi sẽ xem xét sau này :) – Henry

+0

@ HenryGarle Có, tôi vừa kiểm tra tính năng này và xác thực tùy chỉnh không hoạt động khi được đăng lên Bộ điều khiển, nhưng không hoạt động với ApiController. Bạn không chắc chắn làm thế nào để đăng ký nó một cách chính xác cho ApiController. – Dave

+0

Ok thats một khởi đầu tốt, không kế thừa từ ModelValidatorProvider thay vì thực hiện bất kỳ sự khác biệt? – Henry

Trả lời

3

Cuối cùng tôi đã tìm ra điều này, đó là một câu trả lời khá đơn giản. Các ApiControllers chỉ đáp ứng với các nhà cung cấp trong không gian tên System.Web.Http.Validation, không phải là không gian tên System.Web.Mvc được sử dụng cho bộ điều khiển thông thường và xác thực phía máy khách.

Tôi đã triển khai cả hai để đạt được cả xác thực phía máy khách và xác thực máy chủ trong ApiControllers.

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