2014-01-08 94 views
0

我是.NET MVC的新手,請耐心等待。.NET MVC JSON Post調用響應沒有完成或成功

我寫了被觸發的功能時,有上textarea的控制模糊動作:

 function extractURLInfo(url) { 
     $.ajax({ 
      url: "/Popup/Url", 
      type: "POST", 
      data: { url: url }, 
      complete: function (data) { 
       alert(data); 
      }, 
      success: function (data) { 
       alert(data); 
      }, 
      async: true 
     }) 
     .done(function (r) { 
      $("#url-extracts").html(r); 
     }); 
    } 

    jQuery(document).ready(function ($) { 
     $("#input-post-url").blur(function() { 
      extractURLInfo(this.value); 
     }); 
    }); 

這工作得很好,並會打擊控制器:

[HttpPost] 
     public ActionResult Url(string url) 
     { 
      UrlCrawler crawler = new UrlCrawler(); 
      if (crawler.IsValidUrl(url)) 
      { 
       MasterModel model = new MasterModel(); 
       model.NewPostModel = new NewPostModel(); 

       return PartialView("~/Views/Shared/Partials/_ModalURLPartial.cshtml", model); 
      } 
      else 
      { 
       return Json(new { valid = false, message = "This URL is not valid." }, JsonRequestBehavior.AllowGet); 
      } 
     } 

我得到預期的結果如果該URL有效;它會返回一個partialview到.done()函數,我只是在代碼中顯示它。但是,如果URL無效,我希望它能夠完成,成功或完成(我一直在玩耍,看看會發生什麼,但沒有運氣!),並對返回的數據做一些事情。我曾在某個時候觸發完成或成功,但數據是'未定義的'。有人可以幫我解決這個問題嗎?

謝謝!

+1

http://stackoverflow.com/questions/18667447/return-partial-view-and-json-from-asp-net-mvc-action。使用這個鏈接你可以傳遞json和partial,這樣你就可以檢查錯誤信息或者渲染partial。 –

+0

如果它沒有達到完整或成功,那麼您的控制檯可能會出現錯誤。 –

回答

2

在這兩種情況下,你的控制器動作返回200狀態碼,所以它會打你的success回調:

$.ajax({ 
    url: "/Popup/Url", 
    type: "POST", 
    data: { url: url }, 
    success: function (data) { 
     if (data.message) { 
      // Your controller action return a JSON result with an error message 
      // => display that message to the user 
      alert(data.message); 
     } else { 
      // Your controller action returned a text/html partial view 
      // => inject this partial to the desired portion of your DOM 
      $('#url-extracts').html(data); 
     } 
    } 
}); 

但當然更好和語義正確的方法是設置適當的狀態代碼時出錯而不是發生的只是一些返回200個狀態碼:

[HttpPost] 
public ActionResult Url(string url) 
{ 
    UrlCrawler crawler = new UrlCrawler(); 
    if (crawler.IsValidUrl(url)) 
    { 
     MasterModel model = new MasterModel(); 
     model.NewPostModel = new NewPostModel(); 

     return PartialView("~/Views/Shared/Partials/_ModalURLPartial.cshtml", model); 
    } 
    else 
    { 
     Response.StatusCode = 400; 
     Response.TrySkipIisCustomErrors = true; 
     return Json(new { valid = false, message = "This URL is not valid." }, JsonRequestBehavior.AllowGet); 
    } 
} 

,然後在你的AJAX調用,你會妥善處理這些案件:

$.ajax({ 
    url: "/Popup/Url", 
    type: "POST", 
    data: { url: url }, 
    success: function (data) { 
     $('#url-extracts').html(data); 
    }, 
    error: function(xhr) { 
     if (xhr.status == 400) { 
      // The server returned Bad Request status code 
      // => we could parse the JSON result 
      var data = JSON.parse(xhr.responseText); 

      // and display the error message to the user 
      alert(data.message); 
     } 
    } 
}); 

另外不要忘記,你有一些標準的返回錯誤消息的方式,你可以在jQuery中訂閱全局的.ajaxError()處理程序,而不是將這些代碼放入所有的AJAX請求中。

+0

謝謝!我喜歡這個答案,它是超級有用的!我認爲在我的情況下,我只是把錯誤放在textarea下面,而不是用全局div來查看錯誤,但我可能稍後會在其他地方使用該建議。我還需要在Chrome上清除緩存,因爲我在嘗試調試時沒有收到警報。我嘗試了不同的瀏覽器,它運行良好。保存並關閉我的標籤後,我會在Chrome上重試。謝謝! – BellaGurl