2012-01-25 35 views
44

Tôi có dự án asp.net mvc3 nơi tôi thực hiện chỉnh sửa hàng loạt trên một bảng có liên kết loại trực tiếp. Tôi muốn thực hiện các xác nhận hợp lệ như yêu cầu và xác thực số trong khi lưu dữ liệu. Có cách nào dễ dàng hơn để thực hiện việc xác thực không. PS: Tôi không sử dụng biểu mẫu.Xác nhận loại bỏ

Trả lời

82

Hãy xem Knockout-Validation thiết lập rõ ràng và sử dụng những gì được mô tả trong knockout documentation. Theo: Live Ví dụ 1: Buộc đầu vào phải là số

Bạn có thể see it live in Fiddle

CẬP NHẬT: fiddle đã được cập nhật để sử dụng mới nhất KO 2.0.3 và 1.0.2 ko.validation sử dụng CDN CloudFlare url

Để thiết lập ko.validation:

ko.validation.rules.pattern.message = 'Invalid.'; 

ko.validation.configure({ 
    registerExtenders: true, 
    messagesOnModified: true, 
    insertMessages: true, 
    parseInputAttributes: true, 
    messageTemplate: null 
}); 

Để quy tắc xác nhận thiết lập, bộ mở rộng sử dụng. Ví dụ:

var viewModel = { 
    firstName: ko.observable().extend({ minLength: 2, maxLength: 10 }), 
    lastName: ko.observable().extend({ required: true }), 
    emailAddress: ko.observable().extend({ // custom message 
     required: { message: 'Please supply your email address.' } 
    }) 
}; 
+2

Có phải là tôi hoặc là fiddle bị hỏng trên IE9 và IE10? Hoạt động trên Chrome và Firefox tho '. –

+0

@rob: IE9 cho tôi một; "tập lệnh đã bị chặn do loại mime không khớp" -error. Có lẽ bạn có thể vô hiệu hóa kiểm tra bảo mật này. – Cohen

+2

@rob: Để làm cho nó hoạt động trong IE, tôi đã loại bỏ các tài nguyên và sao chép knockout.validation vào fiddle (xấu xí, tôi biết), nó hoạt động tuy nhiên: http://jsfiddle.net/KHFn8/1369/ – Cohen

-21

Xác thực Knockout.js thuận tiện nhưng không mạnh. Bạn luôn phải tạo bản sao xác thực phía máy chủ. Trong trường hợp của bạn (khi bạn sử dụng knockout.js), bạn đang gửi dữ liệu JSON đến máy chủ và ngược lại một cách không đồng bộ, vì vậy bạn có thể làm cho người dùng nghĩ rằng mình thấy xác thực phía máy khách, nhưng trên thực tế nó sẽ là xác thực bên máy chủ không đồng bộ.

Hãy xem ví dụ tại đây upida.cloudapp.net:8080/org.upida.example.knockout/order/create?clientId=1 Đây là liên kết "Tạo đơn đặt hàng". Hãy thử nhấp vào "lưu" và chơi với các sản phẩm. Ví dụ này được thực hiện bằng thư viện upida (có phiên bản mvc mùa xuân và thư viện asp.net của thư viện này) từ codeplex.

+16

-1 Điều này không có gì đặc biệt với Knockout. TẤT CẢ JavaScript cần phải luôn luôn được xác thực trên máy chủ. Thư viện Xác nhận Knockout xác nhận hợp lệ phía máy khách. – Mike

+0

Thêm chu kỳ bổ sung để ping xác thực phía máy chủ tôi nghĩ là không hữu ích trừ khi cần thiết khi trên thực tế bạn có thể xác thực phía máy khách trước :) sau đó đảm bảo qua phía máy chủ. Đây là một thực tế cho dù bạn sử dụng KO hoặc bất kỳ khuôn khổ khác – DropHit

+0

@SeanThorburn Đồng ý. Tôi thậm chí còn không nghĩ đó là một câu trả lời tồi. Tôi có thể thấy điều này làm việc khá tốt trong một số tình huống. – MPavlak

5

Nếu bạn không muốn sử dụng thư viện KnockoutValidation, bạn có thể tự viết thư viện. Đây là một ví dụ cho trường Bắt buộc.

Thêm một lớp javascript với tất cả các phần mở rộng bạn KO hoặc chất trương nở, và thêm những điều sau đây:

ko.extenders.required = function (target, overrideMessage) { 
    //add some sub-observables to our observable 
    target.hasError = ko.observable(); 
    target.validationMessage = ko.observable(); 

    //define a function to do validation 
    function validate(newValue) { 
    target.hasError(newValue ? false : true); 
    target.validationMessage(newValue ? "" : overrideMessage || "This field is required"); 
    } 

    //initial validation 
    validate(target()); 

    //validate whenever the value changes 
    target.subscribe(validate); 

    //return the original observable 
    return target; 
}; 

Sau đó, trong ViewModel của bạn mở rộng bạn quan sát được bằng cách:

self.dateOfPayment: ko.observable().extend({ required: "" }), 

Có một số ví dụ trực tuyến cho kiểu xác thực này.

+0

ok, nhưng tôi nhận được viewmodel của tôi từ phía máy chủ thông qua ajax và dao cạo mvc và knockout.mapping. Tôi cũng nhập vào các mô-đun javaScript trực tiếp từ serverside bằng cách sử dụng .net mvc, chuyển đổi json newton, và trợ giúp nguyên htlml ... Bây giờ .... làm thế nào tôi có thể mở rộng quan sát của tôi mà không áp dụng quan sát một lĩnh vực tại một thời điểm – Clarence

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