4

送信する前に、Javascriptを介してページに入力されたパスワードをハッシュする必要がある「パスワードの変更」ページがあります。さらに複雑なことに、ページはjQuery load()呼び出しを介してロードされ、jQuery.Form ajaxForm()呼び出しによって送信されます。すべてがMVC2で機能していましたが、MVC3で問題が発生しています。

つまり、[パスワードの変更]リンクのあるページがあり、クリックするとパスワードの変更ページがjQueryモーダルポップアップに読み込まれ、パスワードの変更ページのフォームがjQuery.Formライブラリを介して送信されます(基本的には、 $ .ajax呼び出し)、その結果をモーダル同じモーダルポップアップに返します。

基本的に、OldPasswordとNewPasswordの2つのプロパティを持つモデルがあります。これらのビューによって生成された2つの非表示フィールドがあります。これらは、他の2つのフィールド、PrehashOldPasswordとPrehashNewPasswordのハッシュ値を保持し、キーアップイベントを介して更新されます(これは、すべてのキーアップでSHA256ハッシュ全体を実行することを意味します...非効率的ですが、テストのために仕事をしました)。ここで重要なのは、正規表現の検証と必須フィールドの検証は、クライアント側にのみ存在するこれらのPrehashフィールドで実行する必要があるということです(明らかに、これらのフィールドをサーバーに送信したくないので)。

したがって、これら2つを手動で作成し、data-val- *属性を要素に追加します。つまり、MVCヘルパーなどによって生成されません。これが何かが足りないところだと思います。すべてのフィールドが空の状態でフォームを送信すると、すべてのエラーがポップアップ表示されますが、フォームはすぐに送信され、とにかく送信されます。

==

だから私が試したこと:

はい、目立たないライブラリparse()メソッドは、AJAXでロードされたフォームの内容を解析するためにすでに呼び出されており、エラーがフィールドblur()として表示されるので、すべてのデータ検証を正しく取得しているように見えます。送信(ajaxリクエストが完了してポップアップのコンテンツを置き換える前)。

考えられる注意:この目立たないライブラリの解析メソッドの呼び出しは、AJAXがパスワード変更ページをポップアップに正常にロードした後に発生します... AJAXフォーム送信バインディングがdocument.readyに配置され、ロードされたコンテンツ、ergo、AJAXフォーム送信バインディングの準備ができています解析メソッドが送信イベントにバインドする可能性があるという検証呼び出しの前にバインドしている可能性があります。

ただし、(1)他の場所でも同じようなことを問題なく行っています。唯一の違いは、手動で作成している要素にこれらのdata-val-*属性を手動で配置していることです。(2)OldPasswordフィールドまたはNewPasswordフィールドに何らかのエラーが発生した場合、つまり、値をロードしないことによる必須フィールド検証エラーが発生した場合、エラーが表示され、フォームがjQuery.Formを介して送信するのを正常に停止します。方法。

だから私はここで何かが間違っている必要があると思います:

<input id="PrehashNewPassword" type="password" name="PrehashNewPassword" data-val-required="The password field is required." data-val-regex-pattern="<%= RegexHelper.PasswordRegularExpression %>" data-val-regex="<%= RegexHelper.PasswordRegularExpressionError %>" data-val="true" />

エラーが表示されるので、jquery.validateがルールを正しく取得していることを知っています。私がこのようなことをし、フォームのAJAX送信に事前送信コールバックを追加しない限り、これらの手動で生成された要素でエラーが発生したときにフォームの送信を停止することはありません。

        $("#ChangePasswordForm").ajaxForm({
            beforeSubmit: function () { if (!$('#ChangePasswordForm').valid()) { return false; } },
            target: '#overlay'
        });

これは機能しますが、ちょっと醜いので、検証が2回呼び出される原因になると思います...大したことではありませんが、理想的とは言えません。では、これらをバインドするために、目立たないライブラリで行う必要のある他の呼び出しはありますか?

4

2 に答える 2

6

問題を見つけたかどうかはわかりませんが、フォームが有効でない場合は、そこでfalseを返そうとする可能性があります...

.
.
.
    if (!$('form').valid()) {
           return false;
    }

    // JSON POST...
.
.
.

それがうまくいかない場合は、次の方法を試してみてください。

$.validator.unobtrusive.parse($("#dynamicData"));

カスタム入力を動的に追加した後。「dynamicData」は、フォームにラップされた要素のIDです。

上記はここから見つかりました:http ://weblogs.asp.net/imranbaloch/archive/2011/03/05/unobtrusive-client-side-validation-with-dynamic-contents-in-asp-net-mvc.aspx

于 2011-03-08T20:25:18.710 に答える
0

興味深いことに、検証するフォームを取得した場合はどうなりますか?

<script type="text/javascript">
    $("form").submit(function (evt) {

        // validate here should trigger invalid fields
        $('form').valid();

        // JSON POST...         

        // stop form submitting
        evt.preventDefault();
    });
</script>
于 2011-01-26T09:06:28.990 に答える