2015-01-14 42 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); 
} 
相关问题