2012-01-25 12 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.rules.pattern.message = 'Invalid.'; 

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

:セットアップko.validationへのURL

。たとえば、

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は私にAを与えます。 "スクリプトが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 versionとasp.net mvcがあります)を使用して行います。

+16

-1これはKnockoutに特有のものではありません。すべてのJavaScriptは、サーバー上でも常に検証される必要があります。ノックアウト検証ライブラリは、クライアント側を検証します。 – Mike

+0

実際にあなたが最初にクライアント側を検証できるときに、必要でない限り有用ではないと思うサーバー側の検証をpingするために余分なサイクルを追加します。これは、あなたがKOまたは他のフレームワークを使用するかどうかにかかわらず、事実です。 – DropHit

+0

@SeanThorburn合意。私はそれが答えが悪いとは思わなかった。私はこれがいくつかのシナリオではかなりうまく動作することが分かりました。 – MPavlak

5

KnockoutValidationライブラリを使用しない場合は、独自に書き込むことができます。必須フィールドの例を次に示します。

すべてのあなたKO拡張または増量とJavaScriptのクラスを追加し、次の行を追加します。例は多数あります

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

:あなたのViewModelで

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

その後はで観測可能あなたを拡張オンラインでこのタイプの検証を行います。

+0

okですが、私はview.modelをサーバー側からajaxとmvc razorとknockout.mapping経由で取得しています。私はまた、java.netモジュールを.net mvc、newton json変換、およびhtlml生のヘルパーを使ってserversideから直接インポートします...今、....一度に1つのフィールドを観察することなく私のobservablesを拡張するにはどうしたらいいですか? – Clarence

関連する問題