2012-12-19 38 views
7

Tôi đang cố thực hiện xác thực phía máy khách trên các đối tượng của tôi quay lại thông qua WebApi. Tôi gửi thực thể thông qua webapi đến màn hình Chỉnh sửa đối tượng của tôi. Tôi sử dụng loại trực tiếp để liên kết đối tượng với các trường.Xác nhận hợp lệ ứng dụng khách với WebApi

Tôi đã có bộ lọc hành động xử lý tất cả xác thực phía máy chủ. Làm cách nào tôi có thể kết hợp xác thực phía khách hàng mà không phải sao chép chú thích dữ liệu mô hình miền của mình?

Trả lời

0

Khi tôi tạo API HTTP, tôi đặt các đối tượng mô hình (DTO, mô hình yêu cầu, v.v.) vào một hội đồng riêng biệt mà tôi có thể phân phối cho các ứng dụng .NET.

Hãy xem xét các lớp sau đây:

public abstract class UserUpdateRequestModel { 

    [Required] 
    [StringLength(50)] 
    public string Name { get; set; } 

    [Required] 
    [EmailAddress] 
    [StringLength(320)] 
    public string Email { get; set; } 
} 

Đây là những gì tôi sử dụng trong API của tôi:

public UserDto PutUser(Guid key, UserUpdateRequestModel requestModel) { 

    // Do something here 
} 

Bạn có thể sử dụng mô hình này tương tự trong ứng dụng client ASP.NET MVC của bạn ví dụ để tạo ra đầu vào HTML với các thuộc tính xác thực data- như ASP.NET MVC có cách tạo ra các thuộc tính dựa trên các thuộc tính xác nhận chú thích dữ liệu.

+0

Vì vậy, bạn sẽ thêm một số loại đối tượng siêu dữ liệu (trong đó sẽ chứa thuộc tính xác thực) cho phản hồi webapi? Làm thế nào bạn sẽ đi về việc tạo mã phía khách hàng? –

+0

@kpore nếu bạn định sử dụng ASP.NET MVC, nó có cách tạo ra chúng. Ví dụ với phương thức trợ giúp html 'TextBoxFor'. Có một cái nhìn: http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-validation-to-the-model – tugberk

+0

Cảm ơn bạn đã phản hồi. Tôi thực sự không sử dụng MVC. Tôi đang sử dụng WebApi cho tất cả các giao tiếp và kiên trì của tôi. HTML Helpers chỉ dành cho khi bạn đang sử dụng các bộ điều khiển MVC cổ điển. –

1

Với WebApi, bạn cần một chút "keo" mã để kết nối các lỗi quay trở lại từ xác thực mô hình thất bại cho trình xác nhận phía khách hàng.

function extractErrors(jqXhr, validator) { 
    var data = JSON.parse(jqXhr.responseText), // parse the response into a JavaScript object 
     errors = {}; 

    $.each(data.ModelState, function (key, value) { 
     var pieces = key.split('.'); 
     key = pieces[pieces.length - 1]; 
     errors[key] = value 
    }); 

    validator.showErrors(errors); // show the errors using the validator object 
} 

Trên mô hình, chú thích như thường lệ:

[Required] 
[Display(Name = "Group Name")] 
public string Name { get; set; } 

Trong giao diện, thêm các thẻ ValidationMessageFor:

@Html.EditorFor(m => m.Name) 
@Html.ValidationMessageFor(m => m.Name) 
+0

Cảm ơn bạn đã trả lời Phillip. Điều này vẫn yêu cầu một chuyến đi vòng phía máy chủ trước khi bất kỳ xác thực nào được hiển thị cho người dùng. Lấy thuộc tính [Bắt buộc], bạn sẽ không thấy nó được thêm vào biến lỗi của bạn cho đến khi nó không thành công tại máy chủ. Trừ khi tôi đã hiểu lầm giải pháp của bạn, hoặc thất bại một cách hoành tráng khi giải thích vấn đề của tôi. –

+2

Đúng, nó sẽ đăng các giá trị lên máy chủ và lấy lại một chuỗi json. Trong trường hợp của tôi, các biểu mẫu của tôi không lớn, vì vậy tôi nhận được hiệu suất "giống như" của khách hàng, và hành vi "thích" của khách hàng, không có hậu quả rõ ràng. Trên một hình thức nhỏ với 10 valdations, chi phí chuyến đi máy chủ: 1/100th của một máy chủ dev địa phương đánh sec. 1/10 giây đánh máy chủ đám mây AWS từ mạng LAN của công ty. Điều này dành cho ứng dụng loại LOB công ty, có thể không phù hợp cho kết nối di động/chậm. Trong trường hợp của tôi, việc kiểm soát xác nhận bằng cách chú thích mô hình đã đáng giá chuyến đi, và làm cho phát triển sạch hơn và nhanh hơn. –

+0

Cảm ơn thông tin bổ sung, nó thực sự khá hữu ích. Rất tiếc, một số biểu mẫu của chúng tôi có thể khá phức tạp (ví dụ: 50-100 trường hợp trường hợp xấu nhất, vì chúng tôi đang phát triển hệ thống tài chính giao dịch), có lẽ không phải là thiết kế tốt nhất, nhưng doanh nghiệp của chúng tôi đang ra quyết định này. Chúng tôi đang nhận được khoảng 300-400ms chuyến đi đến Azure. –

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