2017-02-20 6 views
0

ブートストラップ・モーダルで部分的なビューをレンダリングしようとすると、部分ビューをレンダリングするajaxリクエストが複数回呼び出されています。私はメインビューにあるボタンのクリックでajaxリクエストを作成しています。mvcで複数回呼び出されたAjaxリクエスト

メインビュー: - 私も

<div class="modal fade" id="surveyPreviewModal" data-backdrop="static" data-keyboard="false" tabindex="-1" role="dialog" aria-labelledby="surveyPreviewLabel" aria-hidden="true"> 
    <div class="modal-lg modal-dialog"> 
     <div class="modal-content" id="surveyPreviewContent"> 
      <div class="modal-header"> 
       <button type="button" class="close" data-dismiss="modal" aria-hidden="true"> 
        &times; 
       </button> 
       <h4 class="modal-title" id="surveyPreviewLabel">Survey Preview</h4> 

      </div> 
      <div class="modal-body" id="surveyPreviewBody"> 
       @Html.Partial("_SurveyPreview",new LMS_TraineeSurveyPaginationViewModel()) 
      </div> 
     </div> 
    </div> 
</div> 

以下のような部分的なビューをレンダリングしていると、これはモーダル

における部分図を描画するメインビューにあるボタンでメインビューをレンダリングしている間
<button id="btnSurveyPreview" class="btn btn-primary" data-toggle="modal" data-target="#surveyPreviewModal" data-surveyID="@ViewBag.SurveyID"> 
Survey Preview 
</button> 

部分的に私は以下のコードを書いています。ブートストラップモードでshowイベント私は部分ビューで書かれたSurveyPreview(js function)を呼び出しています。

@model LMS_TraineeSurveyPaginationViewModel 
$(document).ready(function() { 

    $('#surveyPreviewModal').on('show.bs.modal', function (e) { 

     surveyID = $(e.relatedTarget).attr('data-surveyID'); 

     SurveyPreview(@SurveyPageTypePageNumber.StartPage,null); 

    }); 
}) 

そして

function SurveyPreview(page,btnID) { 

    ....Get SurveyID and page code..... 

$.post('@Url.Action("SurveyPreview", "Survey")', { SurveyID : surveyID, page : page }, 
      function (data) { 

       $('#surveyPreviewBody').html(''); 
       $('#surveyPreviewBody').html(data); 

       SetProgressBar(page,'@(Model==null?0: Model.Pager.TotalPages)'); 

      }).fail(function() { 
       alert("error in GetTraineeSurvey"); 
      }).success(function() { 

      }); 
} 

そしてSurveyPreviewコントローラメソッドから私がモデルと同じ部分図を返すと体をモーダル結果を付加していますが、次のようにSurveyPreview functionに私は、Ajaxリクエストを作っています。

public PartialViewResult SurveyPreview(int SurveyID, int page) 
{ 
--- some code-- 
return PartialView("_SurveyPreview", viewModel); 
} 

は、私が最初にボタンをクリックします、その後、モーダルを開いて閉じ、再度開くこと二回行わAJAXリクエストは、再び閉じて再オープンAjaxのリクエストの後に3回行われてきています。カウンターが増えているたびに

また、私は部分ビューで次の/前のボタンを使って同じ部分表示をしています。

ここで正しいイベントが発生していますか?それとも、私は何かを逃しています ここですか?

この点に関するお役に立ちましたか?

答えて

1

AJAXリクエストを行うたびに、ボタンに複数のクリックハンドラをアタッチしています。このjavascriptをの外側に移動させることをお勧めします。部分ビューでは1回だけ実行されます。

<span id="totalPages" data-pages="@(Model==null ? 0 : Model.Pager.TotalPages)"></span> 
+0

@Daringディミトロフ:

<script> $(document).ready(function() { $('#surveyPreviewModal').on('show.bs.modal', function (e) { surveyID = $(e.relatedTarget).attr('data-surveyID'); SurveyPreview(@SurveyPageTypePageNumber.StartPage, null); }); }); function SurveyPreview(page, btnID) { ....Get SurveyID and page code..... $.post('@Url.Action("SurveyPreview", "Survey")', { SurveyID : surveyID, page : page }, function (data) { $('#surveyPreviewBody').html(data); var totalPages = $('#totalPages').attr('data-pages'); SetProgressBar(page, totalPages); }).fail(function() { alert("error in GetTraineeSurvey"); }).success(function() { }); } </script> 

とあなたの部分の内側のコースの

ビューモデルに基づく全ページが含まれていること<div>を置くことができます:たとえば、あなたは、メインビューの内側にそれを置くことができ。部分的なビュー自体にjavascriptを組み込む理由、他のビューで同じ部分的なビューを再利用するため、各ビューに書き込む必要はありません。これがメインビューにあるので、ボタンに複数のクリックイベントハンドラをどのように付けているのかを私はあなたに教えてくれませんでしたか? – Rohit

+1

はい、このボタンのクリックイベントを購読するjavascriptコードを書いています。そして、このJavaScriptコードを部分的に配置しました。また、AJAXを使用してパーシャルをリロードすると、このjavascriptコードが再び実行され、もう1つのクリックハンドラがボタンに追加されます。等々。また、部分を再利用することもできます。ジャバスクリプトをその内部に配置しないでください。部分的なビューにjavascriptコードを置くことは非常に悪い習慣です。また、javascriptを再利用したい場合は、別のjsファイルに入れてください。次に、必要なすべてのビューにこのjsファイルを含めます。 –

+0

OKですので、data-targetとdata-modal onボタンを使用するとボタンのonclickイベントとして扱われますか? – Rohit

関連する問題