2012-10-29 62 views
0

我在這裏看到了一些類似的問題,但我無法解決這個問題。它似乎不是一個出價交易,因爲它最終它的工作,但試圖顯示一個隱藏的div(模仿彈出窗口)使用Ajax時單擊按鈕,如果我調試我可以看到方法中的控制器(ConfirmMaxBid)被調用兩次(甚至更多我感覺有時甚至更多次,並通過代碼混合流程,即來回)。單擊按鈕時Ajax函數被調用兩次

這裏的景色

@model UI.Models.BidOnAuctionViewModel 
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Content/js/BidAndMaxBidConfirmation.js")" type="text/javascript"></script> 

@{ 
    var disableButton = Model.AuctionOpen ? "" : "bid-btn-disabled";  
} 

@using (Html.BeginForm("ConfirmMaxBid", "Lot")) 
{ 
    <fieldset> 
    <div class="lotdetail-maxbid-row"> 
     <label>Your Max Bid</label> 
     @*<input id="Amount" class="radius2 text-box single-line valid" type="text" name="Amount" data-val-required="The Amount field is required." data-val-number="The field Amount must be a number." data-val="true">*@ 
     @if (Model.AuctionOpen) 
     { 
      @Html.TextBoxFor(model => model.Amount, new {@class = "radius2 text-box single-line valid"}) 
     } 
     else 
     { 
      @Html.TextBoxFor(model => model.Amount, new {@class = "radius2 text-box single-line valid", @disabled = "disabled"}) 
     } 
    </div> 
    <input type="submit" id="autobidButton" value="Increase Max bid" class="btn btn-level2 btn-maxbid @disableButton" /> 
    </fieldset> 

    <div id="autoBidConfirmation" class="lotdetail-modal" style="display: none;"> 
    @Html.HiddenFor(model => model.AuctionId) 
    @Html.HiddenFor(model => model.AutobidAmount) 
    @Html.HiddenFor(model => model.AuctionEventId) 
    <h4 id="confirmationMessage"></h4> 
    <span id="returnedCorrectedAmount" class="lotdetail-modal-msg"></span> 
    <input name="button" value="Place bid" type="submit" class="btn btn-level2" /> 
    <input id="cancelAutoBid" name="button" value="Cancel" type="submit" class="btn btn-level2 btn-cancel" /> 
    </div> 
} 

而這裏的所謂腳本的功能時的document.ready

$('#autobidButton').click(function (e) { 
    e.preventDefault(); 
    var model = 
     { 
      AuctionEventId: $('#AuctionEventId').val(), 
      AuctionId: $('#AuctionId').val(), 
      Amount: $('#Amount').val() 
     }; 
    $.ajax({ 
     url: "/Lot/ConfirmMaxBid", 
     dataType: 'json', 
     type: "POST", 
     contentType: 'application/json; charset=utf-8', 
     data: JSON.stringify(model), 
     success: function (data) { 
      var amount = "$" + data.AutobidAmount; 
      $('#returnedCorrectedAmount').html(amount); 
      $('#AutobidAmount').val(data.AutobidAmount); 
      $('#confirmationMessage').text(data.AutobidConfirmationMessage); 
      $('#autoBidConfirmation').show(); 
     } 
    }); 
}); 

最後是這樣的方法(部分被稱爲兩次至少,爲了避免這個問題,太長)

public ActionResult ConfirmMaxBid(string button, BidOnAuctionViewModel model) 
    { 
     if(Request.IsAjaxRequest()) 
     { 
      var confirmationMessage = "Confirm your bid"; 
      var correctedAmount = model.Amount; 
      if (!CheckMaxBidFitsIncrementTier(model.Amount, model.AuctionEventId)) 
      { 
       confirmationMessage = "This bid can't be placed, do you want to place the following instead?"; 
       correctedAmount = CalculateNextBidAmountForWrongMaxAmount(model.Amount, model.AuctionEventId); 
      } 

      return Json(new 
      { 
       AutobidAmount = correctedAmount, 
       model.AuctionId, 
       model.AuctionEventId, 
       AutobidConfirmationMessage = confirmationMessage 
      }); 
     } 

     if (button == "Place bid") 
     { 
      //Here's the code to do the stuff when confirming in the partial view 

任何想法爲什麼發生這種情況?

在此先感謝

更新

放置一些警報後(調試的非常原始的方式,我猜的)我看到,該方法只是成功函數的最後一行後再次調用($後('#autoBidConfirmation')。show();)

+0

你如何包括你的JS?它在某個地方是在內聯嗎? –

回答

1

您的文檔可能在異步回發後準備好多次。

試着這麼做:

$(document).ready(OnDocumentReady); 

function OnDocumentReady() 
{ 
    $("#autobidButton") 
      .unbind("click", AutoBidFunction) 
      .click(AutoBidFunction); 
} 

function AutoBidFunction(e) 
{ 
    // Code Here 
} 
+0

該事件只發生一次,無論是後衛。 –

+0

好吧,我正在努力解決這個問題,因爲我無法完成工作。但是我在alert.ready中加入了一個alert,實際上它被調用了兩次,所以我認爲答案是正確的.Js不是內聯的,Kevin。該腳本位於視圖 – mitomed

+0

中引用的BidAndMaxBidConfirmation.js中,但我認爲您是對的Kevin,即使文檔已經發生多次,事件也只發生一次。這是正確的嗎? – mitomed

相關問題