2015-01-14 70 views
1

我一直在使用Knockout和Entity Framework來關注我的MVC項目的在線教程。我也在使用存儲庫模式。替代MVC控制器操作返回字符串?

從我發現的情況來看,教程在執行HTTP POST請求時會返回字符串,如下所示。我擔心的是控制器正在返回字符串 - 它看起來似乎很簡陋,而且我似乎無法找到一個可靠的示例/教程,說明如何執行這些POST請求(除非返回視圖),以及捕獲數據庫異常和POST異常也是如此。

的Javascript:

self.saveNRI = function() { 
     var token = $('[name=__RequestVerificationToken]').val(); 
     var headers = {}; 
     headers["__RequestVerificationToken"] = token; 
     $.ajax({ 
      type: "POST", 
      url: '/nris/Create', 
      headers: headers, 
      dataType: 'json', 
      data: ko.toJSON(self.nri), 
      contentType: 'application/json', 
      success: function (result) { }, 
      error: function (err) { 
       if (err.responseText == "Success") { 
        window.location.href = '/nris/Index/'; 
       } 
       if (err.responseText == "Failed") { 
        alert("save failed"); 
       } 
      } 
     }); 
    } 

控制器:

[HttpPost] 
public string Create(DTO incomingModel) 
{ 
    if (ModelState.IsValid){ 
     try 
     { 
      _nriRepository.Insert(incomingModel);      
     } 
     catch (Exception ex) 
     { 
      return "Failed"; 
     }   
    } 
    return "Success"; 
} 

庫:

public async void Insert(DTO n) 
{ 
    //Insert code removed for brevity 
     await _context.SaveChangesAsync(); 
} 
+1

看看下面的文章,瞭解如何處理AJAX調用異常的一些想法:http:// stackoverflow。com/questions/4707755/asp-net-mvc-ajax-error-handling –

+0

@chickenricekid它已經有一段時間了,因爲這引起了你的注意。你能否評論答案是否可以改進,或接受其中的一個?謝謝。 – firstdoit

+1

@ gadr90表示道歉 - 我已經參加過多次商務旅行,因此我沒有機會全面實施您的答案。但是,它看起來像是我正在尋找的答案,並且不管它是否仍然是有價值的信息。我會繼續並接受你的回答。再次感謝! – chickenricekid

回答

4

這可能是一個好IDEA®使用好老定期HTTP Status Codes對通信業務的結果你的API。

在創建資源時傳遞成功的適當代碼是201。通常,響應主體將包含新創建的資源的ID或URL。

10.2.2 201已創建

請求已經完成,並導致新的資源被創建 。新創建的資源可由響應實體中返回的URI(s) 引用,其中最具體的URI爲 由位置標題字段給出的資源。響應應該包括一個實體,該實體包含資源特性列表和用戶或用戶代理可以從中選擇最適合的一個或多個位置(一個或多個)。實體格式由內容類型頭部字段 中給出的媒體類型指定。源服務器必須在返回201狀態碼之前創建 資源。如果立即執行的動作不可能是 ,則服務器應該使用202(已接受) 響應進行響應。

但是,您也可以使用更通用的狀態碼200指示成功:

10.2.1 200 OK

請求成功。響應 返回的信息取決於請求中使用的方法,例如:

GET請求資源對應的實體發送的響應是 ;

HEAD與請求的資源 對應的實體頭字段在沒有任何消息體的響應中發送;

發佈描述或包含操作結果的實體;

跟蹤包含請求消息的實體,該請求消息與服務器的末端 一樣。

要溝通失敗,您可能會使用範圍在4xx5xx的代碼。

A 4xx表示失敗在客戶端。例如,客戶端沒有發送所有必需的屬性來創建資源。通用400是得心應手:

10.4.1 400錯誤的請求

請求不能被服務器由於格式不正確的語法 理解。如果沒有 修改,客戶端不應該重複請求。

但是,5xx表示您的服務器在履行請求時遇到問題。

10.5.4 503服務不可用

服務器目前無法處理該請求,由於服務器的 暫時超載或維護。其含義是 ,這是一個暫時的情況,延遲一段時間後將會緩解。如果已知,延遲的長度可以在 Retry-After標題中指示。如果沒有給出Retry-After,那麼客戶端應該處理響應,就像處理500響應一樣。

在客戶端,您可以依靠jQuery.ajax根據狀態代碼正確地路由回調。您應該使用更新的基於Promise的API,而不是成功和錯誤回調。例如:

var jqxhr = $.ajax("example.php") 
    .done(function() { 
    alert("success"); 
    }) 
    .fail(function() { 
    alert("error"); 
    }) 
    .always(function() { 
    alert("complete"); 
    }); 

來源:http://api.jquery.com/jquery.ajax/

您可以使用優秀的httpstat.us Web服務來測試響應代碼。只需將所需的響應代碼附加到URL,它就會返回一個模擬答案。例如,一個成功的例子:http://httpstat.us/200

+1

該死的好回答=) – roryok

+0

謝謝:)在遵守標準的情況下儘可能地重要。沒有理由不去。 – firstdoit

2

我喜歡@ gadr90的回答最好,但我想我還會提到你可以直接從MVC中的ActionResult返回JSON。

[HttpPost] 
public JsonResult Create(DTO incomingModel) 
{ 
    if (ModelState.IsValid) 
    { 
     try 
     { 
      _nriRepository.Insert(incomingModel);      
     } 
     catch (Exception ex) 
     { 
      var x = new 
      { 
       status = "Failed", 
       message = ex.Message, 
      }; 
      return this.Json(x); 
     }   
    } 
    var x = new 
    { 
     status = "Success", 
     message = "", 
    }; 
    return this.Json(x); 
} 
相關問題