2

ユーザー アクティビティ (ログ データ) を追跡したい。特定の方法でフォームを送信するページにいくつかのリンクがあります。問題は次のとおりです。

クリック イベントを処理し、データベースにログを簡単な方法で挿入する適切な方法が見つかりません。

私のコード:

HtmlGenericControl a = new HtmlGenericControl("a");
a.Attributes["onclick"] = "$('#" + frm.ClientID + "').submit();";
a.InnerText = "site " + dt_list.ElementAtOrDefault(0).Field<string>("pro_name").TrimEnd();
inner_li_1.Controls.Add(a);

今、私は提出を行うリンクのクリックイベントを処理したい?!!

4

2 に答える 2

2

これは多すぎますが、どのように機能しても、他の方法ではできない場合に使用します。

JavaScript の呼び出しです。最初にログを呼び出してから、送信を続けます。また、クリックすると待機メッセージが表示されますが、イベントの発生が速すぎて、ユーザーがそれを待機していることを理解していませんでした。また、単純な JavaScript を使用して、アクションのログが二重にならないように注意します。イベントでこの関数を呼び出しますonclick

var confirmSubmited = false;
function SubmitWithLog(me)
{
    // to avoid many clicks...
    if(confirmSubmited)
      return false;

    confirmSubmited=true;

    jQuery.ajax({
        url: "/LogAction.ashx",
        type: "GET",
        timeout: 3000,
        async: true, // you can try and async:false - maybe is better for you
        data: action=4, // here you send the log informations
        cache: false,
        success: function(html) {
            jQuery("#FormID").submit();
        },
        error: function(responseText, textStatus, XMLHttpRequest) {                 
            jQuery("#FormID").submit();
        }
    });

    return false;
}

ハンドラーは次のとおりです

public class LogAction : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
                // log here what you wish

                // end up with no content
        context.Response.TrySkipIisCustomErrors = true;
        context.Response.Status = "204 No Content";
        context.Response.StatusCode = 204;          
    }
}

これはユーザー アクションをログに記録する良い方法ではありませんが、他の方法では実行できない場合の方法であることを明確にしたいと思います。ユーザーが送信してサイトを離れ、別のサイトに移動するときにのみ使用し、このアクションを記述するために使用します。

他のすべての場合、私はエーテルをURLの参照として使用し、エーテルは背後のコードでログを作成し、エーテルはhtmlページに空の画像を含めてログを次のようにします: HTMLページのASPサーバー統計

私はajaxを呼び出そうとしましたが、正しい方法で送信を行いましたが、失敗し、送信によってajaxが停止しました。次の方法は、タイムアウトを使用して ajax を呼び出し、タイムアウトを 500 ミリ秒に設定して送信することでしたが、私が行ったように ajax 呼び出しにかかる時間は 100 ミリ秒未満であるため、タイムアウトを回避します。

于 2012-06-10T12:50:37.843 に答える
1

@Aristos -- ロギングを行う Ajax 呼び出しが返されるのを待ってからイベント (クリック、送信など) に進むことで、ユーザー エクスペリエンスに悪影響を与えるのはなぜでしょうか?!? ロギングはアプリケーションの重要ではない部分であり、その結果に基づいてユーザー エクスペリエンスが変化することはありません。これは「送信して忘れる」タイプのルーチンです。Ajax リクエストを開始し、成功ルーチンと失敗ルーチンを空のままにして、$.ajax(); の直後の行で送信を実行します。電話。

それで、あなたのためのいくつかの疑似コード...

function handleClick(e) {
    handleLoggingOnClick("something happened here");

    myForm.submit();
}

function handleLoggingOnClick(message) {
    $.ajax({url:"logging.do", data:"message="+message});  
}
于 2012-06-10T14:12:08.030 に答える