2012-07-11 47 views
0

我使用MVC 3,C#在IE9 在我的控制,我有以下2個ActionResuls是重要的:MVC C# - 需要做POST只有一次在提交

public ActionResult EditTrain(String trainid) 
    { 
     .... 
     return PartialView(edittrain); 
    } 


    [HttpPost] 
    public ActionResult EditTrain(Train editrain) 
    { 
     .... 
     DataContext.SubmitChanges();  
     return RedirectToAction("Edit", new { id = trainid });     
    } 

在局部視圖,我有以下代碼:

@model Models.EditTrain 
    @{ 
     ViewBag.Title = "Training"; 
    } 

    <h2>Train</h2> 
    @using (Html.BeginForm(null, null, FormMethod.Post, new { id = "theForm" })) 
    { 
     @Html.ValidationSummary(false) 

     @Html.HiddenFor(model => model.ID) 

     <div class="display-label" style="font-weight: normal"> 
     @Html.Label("ID:") 
     </div> 
     <div class="display-field"> 
     @Html.DisplayFor(model => model.ID) 
     </div> 

     <div class="display-label" style="font-weight: normal"> 
     @Html.Label("KitID:") 
     </div> 
     <div class="display-field"> 
     @Html.DisplayFor(model => model.KitID) 
     </div> 

     <div class="editor-label"> 
     @Html.Label("Inactive:") 
     </div> 
     <div class="editor-field"> 
     @Html.EditorFor(model => model.Inactive) 
     </div>  

     <div class="editor-label"> 
     @Html.Label("Inactive Date:") 
    </div> 

    <div id='datepicker' class="editor-field"> 
     @Html.EditorFor(model => model.InactiveDate) 
    </div> 
     ...... 
     <div style="clear:left;"> 
     <br />   
     <p> 
     <input type="submit" id="submit" value="Submit" /> 
     </p> 
     </div> 
    } 

    <script type="text/javascript"> 

    $.ajaxSetup({ cache: false }); 

    $(document).ready(function() { 

    $("#submit").click(function() { 

     $.ajax({ 
       type: "POST", 
       url: url, 
       data: $('#theForm').serialize() 
      }); 

     $("#stlist").load('@Url.Action("KitsEdit","Spr")' + '?id=' + '@Model.sprid'); 

    }); 
    }); 

在上面的代碼,我喜歡上面出現的情況是,一旦用戶點擊提交,我喜歡去以下行動:

[HttpPost] 
    public ActionResult EditTrain(Train editrain) 

,然後返回到查看和運行下面的代碼

 $("#stlist").load('@Url.Action("KitsEdit","Spr")' + '?id=' + '@Model.sprid'); 

什麼,雖然發生的是,它上面的,但它運行

$("#stlist").load('@Url.Action("KitsEdit","Spr")' + '?id=' + '@Model.sprid'); 

後運行

[HttpPost] 
    public ActionResult EditTrain(Train editrain) 

第二次。

我怎麼能阻止它的.load後要

[HttpPost] 
    public ActionResult EditTrain(Train editrain) 

()。

回答

0

您應該從.click()處理程序返回false。但是看看你的代碼有一些概念上的錯誤。您在啓動AJAX請求後立即調用.load方法,而無需等待此AJAX請求完成。另外,調用一個控制器動作,使用AJAX重定向到另一個動作也沒什麼意義。

+0

感謝達林,我加了異步:假的,我相信這是現在需要的,對不對? – 2012-07-11 15:59:39

+0

這更糟。只需刪除此AJAX呼叫。設置'async:false'會在通話過程中凍結瀏覽器,從而造成有史以來最糟糕的用戶體驗之一。如果你想使用AJAX,那麼它應該是異步的。如果沒有,只需使用標準表單提交。 – 2012-07-11 16:00:05

+0

對不起達林,我無法跟隨你。當你說你在發出AJAX請求後立即調用.load方法,甚至沒有等待這個AJAX請求完成,我認爲異步:false會修復它。在我的情況下,我需要做一個POST,然後加載()。如果你能澄清。謝謝 – 2012-07-11 16:05:54

0

可以使用request.Abort()

$(document).ready(function() { 

    $("#submit").click(function() { 

     var request = $.ajax({ 
       type: "POST", 
       url: url, 
       data: $('#theForm').serialize() 
      }); 

     $("#stlist").load('@Url.Action("KitsEdit","Spr")' + '?id=' + '@Model.sprid'); 
request.Abort() 
    }); 
    }); 
+0

我用request.Abort()它給了一個錯誤。瀏覽器不知道什麼請求Microsoft JScript運行時錯誤:'請求'是未定義的 – 2012-07-11 16:08:27