2012-04-25 58 views
0

我有一個表格,我試圖用Ajax提交/無需重新加載頁面。這個jQuery表單發佈有什麼問題?

Ajax調用正在服務器上,但它似乎沒有調用該函數。我試過$.post$.ajax。這兩者似乎都不起作用。幾個星期前我的工作非常相似,但現在我無法複製它。 (最終目標是將模型作爲部分視圖返回,以便查看驗證。)

使用Firefox時,控制器方法立即生效。使用Chrome,瀏覽器選項卡似乎鎖定。它有時在延遲後碰撞控制器。 (型號信息準確無誤。)

我在這裏做錯了什麼?

我有我在這裏的局部視圖:

<% using (Ajax.BeginForm("CreateSimpleReport", "Main", new AjaxOptions { HttpMethod="POST" }, new { id="CreateSimpleReport" })){ %> 
    <%: Html.ValidationSummary(false, "Report creation was unsuccessful. Please correct the errors and try again.", new { @class = "validation_summary" })%> 
    <% Html.EnableClientValidation(); %> 
    <div class="col"> 
<div class="row"> 
    <div class="label"> 
     <%: Html.LabelFor(m => m.Name)%> 
    </div> 
    <div class="field"> 
     <%: Html.TextBoxFor(m => m.Name, new { @class = "input texbox" })%> 
     <%: Html.ValidationMessageFor(m => m.Name, "*")%> 
    </div> 
</div> 
<div class="row"> 
    <div class="label"> 
     <%: Html.LabelFor(m => m.Description)%> 
    </div> 
    <div class="field"> 
     <%: Html.TextBoxFor(m => m.Description, new { @class = "input texbox" })%> 
     <%: Html.ValidationMessageFor(m => m.Description, "*")%> 
    </div> 
</div> 
<div class="row"> 
    <div class="label"> 
     <%: Html.LabelFor(m => m.Quantity)%> 
    </div> 
    <div class="field"> 
     <%: Html.TextBoxFor(m => m.Quantity, new { @class = "input texbox" })%> 
     <%: Html.ValidationMessageFor(m => m.Quantity, "*")%> 
    </div> 
</div> 
<div class="right"><input type="submit" class="button" value="Create Report" /></div> 
</div> 
<% } %> 

控制器:

[HttpPost] 
public string CreateSimpleReport(SimpleReportModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     // do something 
     return "success"; 
    } 
    else 
    { 
     return "failure"; 
    } 
} 

最後,jQuery的:

 $('#CreateSimpleReport').on('submit', function (e) { 
      var $this = $(this); 
      $.post((this), (this), function(data) { 
       alert('finish'); 
      }); 
//   $.ajax({ 
//    type: 'POST', 
//    url: (this), 
//    data: (this), 
//    success: function() { 
//     alert('success'); 
//    }, 
//    error: function (jqXHR, textStatus, errorThrown) { 
//     alert('error'); 
//    } 
//   }); // end ajax call 
     }); 

回答

1

你不應該混合Ajax.*幫手jQuery.ajax。如果您使用Ajax.BeginForm助手,那麼只需包含jquery.unobtrusive-ajax.js腳本(ASP.NET MVC 3)或MicrosoftAjax.jsMicrosoftMvcAjax.js腳本(ASP.NET MVC 2)並訂閱AjaxOptions中的成功回調。

如果你決定使用jQuery.ajax手動然後使用標準Html.BeginForm:

<% using (Html.BeginForm("CreateSimpleReport", "Main", FormMethod.Post, new { id = "CreateSimpleReport" })) { %> 

然後:

$(function() { 
    $('#CreateSimpleReport').on('submit', function() { 
     $.ajax({ 
      url: this.action, 
      type: this.method, 
      data: $(this).serialize(), 
      success: function(result) { 
       alert('AJAX success'); 
      } 
     }); 

     // make sure you return false to cancel the default event 
     return false; 
    }); 
}); 
+0

是否有任何理由爲什麼這會切換到新的頁面作爲內容的結果?我回來了.. – Cody 2012-05-07 16:06:26

+0

不知道。一個可能的原因是您的頁面上的JavaScript錯誤,從而阻止腳本執行並返回false行。 – 2012-05-07 16:11:44

0
$.post((this), (this) 

(沒有雙關語意)沒有意義。您也不能將參數作爲DOM元素髮布到DOM元素。除此之外,您需要e.preventDefault();(或return false;)以避免提交常規表單。所以當你的回調會觸發時,頁面已經被重新加載。

通過AJAX提交表單的最簡單方法是使用jQuery form plugin

+0

它也沒有任何意義,但我用它之前(我曾看到它在一個例子中)和模型c通過適當的價值觀。 – Cody 2012-04-25 22:12:08

+0

無論如何你都應該改變它。並且可能遠離那個例子(聽起來有點像你在w3schools網站上找到的東西) – ThiefMaster 2012-04-26 05:38:59

0

你已經在使用Ajax.BeginForm,爲什麼你需要jQuery腳本來做ajax?

您是否包含jquery.unobtrusive-ajax.js

+0

只用'Ajax.BeginForm'來做,頁面重新加載。 – Cody 2012-04-25 22:09:25