2

コンテキストを説明しましょう: jquery ダイアログ内に個人フォームがあり、この個人に関連する情報 (個人データ、住所、電子メール、役職など) をグループ化するためのタブがいくつかあります。

タブの 1 つは、このコントローラー アクションへの ajax 呼び出しを介して個人のアドレスを表示します。

[HttpGet]
public ActionResult GetAddresses( int id, int? page ) {
    IEnumerable<AddressModel> list = _manager.GetAddressesByContact( id ).AsPagination( page ?? 1, 2 );
    ViewData["__ContactID"] = id;
    return PartialView( "AddressList", list );
}

次に、グリッドとページャーを作成する次のコードを部分的に持っています

<%= Html.Grid(Model).Columns( column => {
    column.For(addr => addr.GetAddressTypeList().First(at => at.AddressTypeID == addr.AddressTypeID).Description).Named("Tipo");
    column.For( addr => ( addr.IsPostalAddress ) ? Html.Image( "/_assets/images/PostalAddress.gif", "Indirizzo per la corrispondenza" ) : "&nbsp;" ).Encode(false).Named("Posta");
    column.For(addr => addr.StreetAddress + "<br />" + addr.ZipCode + ", " + addr.City + "<br />" + 
        addr.GetProvinceList().First( p => p.ProvinceID == addr.ProvinceID).Description + ", " +
        addr.GetCountryList().First( c => c.CountryID == addr.CountryID).Name).Named("Indirizzo").Encode(false);
    column.For( addr => 
        "<a href='/Contact/EditAddress/" + addr.AddressID + "' class='ajaxLink' title='Modifica'><img src='/_assets/images/edit.png' alt='' /></a>"
        ).Attributes( style => "width:16px").Encode(false);
    column.For( addr =>
        "<a href='/Contact/DeleteAddress/" + addr.AddressID + "' class='ajaxLink' title='Elimina'><img src='/_assets/images/delete.png' alt='' /></a>"
        ).Attributes( style => "width:16px" ).Encode( false );
    } ).Attributes( @class => "table-list" )%>

<br />
<%= Html.Pager((IPagination)Model).First("Prima").Next("Successiva").Previous("Precedente").Last("Ultima").Format("Visualizzati {0}-{1} di {2}") %>

ページャーで ajax を有効にするために、次のコードを使用しました。

$(".paginationRight > a").live("click", function(event) {
    //stop the browser from going to the relevant URL
    event.preventDefault();
    $.ajax({
        type: "get",
        dataType: "html",
        url: this.href,
        data: {},
        success: function (response) {
            $("#addressListPlaceholder").html('').html(response);
        }
    });
});

1つのことを除いて、すべてが非常にうまく機能します。ページング リンクをクリックすると、次の Fiddler スクリーンショットからわかるように、サーバーへの無限の要求があります。どうなるの????? 代替テキスト

更新: Vinzenz のアドバイスに従い、ajax 呼び出しの後に命令event.stopPropagation()と命令を追加しました。return falseで、〜がある

  • 最初にページャーの次へのリンクを 1 回クリックし (リクエスト 48)、Fiddler は 1 つのリクエストを示しました。
  • 前のリンクをクリックしました。Fiddler は 2 つの要求を示しています (49 と 50)
  • [次へ] リンクをもう一度クリックしました。Fiddler レポート 4 要求 (51、52、53、および 54)

一般的に、前後にクリックし続けると、サーバーに対するリクエストの数は常に増加します.... :(

代替テキスト

4

2 に答える 2

1

私の提案は、コードを「ライブアタッチ」することです。

$(".paginationRight > a").live("click", function(event) {
    //stop the browser from going to the relevant URL
    event.preventDefault();
    $.ajax({
        type: "get",
        dataType: "html",
        url: this.href,
        data: {},
        success: function (response) {
            $("#addressListPlaceholder").html('').html(response);
        }
    });
});

部分ビューではなく、タブを定義したページ (「親ページ」) に表示されます。

于 2012-05-15T07:27:44.390 に答える
1

return false;このイベント ハンドラーからのテスト上の理由から、または呼び出します。event.stopPropagation();

同じハンドラーを 2 回以上登録し、何らかの形で相互にトリガーするなど、別の場所でコードに何らかの問題が発生している可能性があります。詳しい情報がないとわかりにくいです。

ただし、私の提案を使用してみてください。それが役立つかどうかがわかります。

于 2010-10-13T23:17:04.080 に答える