0

動的に生成されたマークアップを持つページで作業しています。そのため、フォームで使用できるフィールドがわかりません。したがって、ビュー モデルを作成する代わりに、POST メソッドは FormCollection を使用します。POST を受信すると、プログラムはすぐに実行されます。

私の問題: フォームで [SUBMIT] をクリックすると、コントローラーの POST アクションの最初の行でブレークポイントに到達するまでに約 10 ~ 15 秒かかります。私のシナリオでは、フォームに 800 個の入力フィールドがあります。たった 800 フィールドの FormCollection を作成するのに、本当にこれほど時間がかかるのでしょうか? プロセスを合理化し、応答時間を改善する方法はありますか?

編集:

IE プロファイラーは、ほとんどの時間が JQuery CSS セレクターに費やされていることを示しています。すべての CSS を削除すると、ページは非常に速く動作します。サーバーにポストバックする前に CSS セレクターが実行されるのはなぜですか? 無効にできますか?

編集 2: プロファイラーは現在、JQuery 1.6.4.min.js で費やした時間を表示しています。関数は「k」です。それは単なる内部変数ルックアップだと思います。また、入力フィールドから 'size' および 'maxlength' 属性を削除すると、ページの応答が速くなることもわかりました (万歳)...例外は...クライアント側の検証に必要です。私はまだ速度を改善する方法を見つけようとしています。または、属性を削除して、クライアント側のフィールドの入力長を制限する方法を保持しています。

編集 3: jquery-1.6.4.min.js を掘り下げて、関数 k を見つけました。編集 2 に従って、「maxlength」属性と「size」属性を追加/削除すると、すべての違いが生じます (3k ミリ秒ではなく 33K ミリ秒)。ただし、関数 K は多くのことを行う必要はありません...それらは nodetype===1 ではなく、最初の IF が失敗し、次の行で関数から戻る必要があるためです。

function k(a,c,d)
    {
        if(d===b&&a.nodeType===1)
        {
            var e="data-"+c.replace(j,"-$1").toLowerCase();
            d=a.getAttribute(e);
            if(typeof d=="string")
            {
                try
                {
                    d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)
                }
                catch(g){}
                f.data(a,c,d)
            }
            else 
                d=b
        }
        return d
    }
4

2 に答える 2

1

1000 個のフィールドを含むフォームを作成したところ、コントローラーは送信してから 1 秒もかからずに各フィールドにアクセスできます。

これは私がフィールドを作成する方法です:

<script language="javascript" type="text/javascript">
$(document).ready(function () {
    for (var i = 0; i < 1000; i++) {
    $('<input/>').attr({ type: 'text', id: 'test'+i, name: 'test'+i,value:'test '+i }).appendTo('#fields');
    }
    });
</script>

これがアクションです:

    public ActionResult TestFields()
    {
        for (int i = 0; i < 1000; i++)
        {
            if (Request.Form[i] != string.Format("test{0}", i))
            {
                throw new Exception("bad value received");
            }
        }
            return View();
    }

FormCollection にフォーム値を設定することは問題ではないようです。短い値とローカル ネットワークでのテストがあります。値が長く、ネットワークが遅い場合、それが問題になる可能性があります。それぞれの値が 1KB の場合、800KB を送信する必要があります。

于 2012-07-15T16:45:10.137 に答える
0

Mystere Manとのコメントから、クライアント側が何らかの形で検証していたことが判明しました。このリンクは問題を解決しました:http: //forums.asp.net/t/1523883.aspx/1/10?Disabling+ client+side+validation+オン+送信+ボタン+

基本的に、送信ボタンの検証を無効にしました。これにより、ユーザーが入力したときに「maxlength」属性と「size」属性が機能しますが、POSTでのクライアント側の検証はできなくなります。入力が処理されるときにサーバーが再度検証するため、この動作は問題ないようです。POSTの平均時間が33秒から2秒に変更されました。

こちらもこちら: MVC3の「キャンセル」送信ボタンでクライアント側の検証を無効にする

于 2012-07-17T15:56:43.523 に答える