2012-01-25 320 views
44

我有一個asp.net mvc3項目,我在一個桌面上用批量綁定進行批量編輯。我希望在保存數據的同時進行需求驗證和數字驗證等驗證。有沒有更簡單的方法來淘汰驗證。 PS:我不使用表格。敲除驗證

回答

82

看看Knockout-Validation乾淨的設置和使用knockout documentation中描述的內容。下設:活生生的例子1:強制輸入是數字

可以see it live in Fiddle

UPDATE:小提琴已經更新使用cloudfare CDN使用最新KO 2.0.3和1.0.2 ko.validation網址

要設置ko.validation:

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

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

要設置驗證規則,運用擴展。例如:

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

難道是我還是IE9和IE10上的小提琴?在Chrome和Firefox上運行。 –

+0

@rob:IE9給了我一個; 「腳本因MIME類型不匹配而被阻止」 - 錯誤。可能你可以禁用這個安全檢查。 – Cohen

+2

@rob:爲了使它在IE中工作,我已經刪除了資源並將knockout.validation複製到小提琴中(醜陋,我知道),但它確實有效:http://jsfiddle.net/KHFn8/1369/ – Cohen

-21

Knockout.js驗證方便,但不穩健。您始終必須創建服務器端驗證副本。就你的情況而言(當你使用knockout.js時),你正在向服務器發送JSON數據並異步返回,所以你可以讓用戶認爲他看到了客戶端驗證,但實際上它將是異步服務器端驗證。

看看這裏的例子upida.cloudapp.net:8080/org.upida.example.knockout/order/create?clientId=1 這是一個「創建訂單」鏈接。嘗試點擊「保存」,並玩產品。 本示例使用codeplex使用upida庫(該庫有spring mvc版本和asp.net mvc)。

+16

-1這不是Knockout特有的。所有JavaScript都需要始終在服務器上進行驗證。 Knockout驗證庫驗證客戶端。 – Mike

+0

添加額外的週期來ping服務器端驗證我認爲沒有用,除非必要,事實上,您可以先驗證客戶端:)然後通過服務器端確保。這是你是否使用KO或任何其他框架 – DropHit

+0

@SeanThorburn同意的事實。我甚至不認爲這是一個不好的答案。在某些情況下,我可以看到這個工作得很好。 – MPavlak

5

如果你不想使用KnockoutValidation庫,你可以自己寫。這是一個強制性字段的例子。

添加JavaScript類與所有你KO延伸或擴展,並添加以下內容:

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

然後在您的視圖模型擴展您觀察到的是:

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

有許多的例子在線進行此類驗證。

+0

好吧,但我通過ajax和mvc剃鬚刀和knockout.mapping從服務器端獲取我的viewmodel。我也使用.net mvc,newton json轉換和htlml raw helpers直接從服務器端導入到javaScript模塊中...現在....我怎樣才能擴展我的observable而不用每次應用一個字段 – Clarence