返回字符串的MVC控制器操作的替代方法?

时间:2015-01-14 20:03:09

标签: c# ajax asp.net-mvc-4 knockout.js

我一直在使用Knockout和Entity Framework关注我的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();
}

2 个答案:

答案 0 :(得分:4)

使用优秀的旧常规HTTP Status Codes来传达API上的操作结果可能是一个好主意。

在创建资源时传达成功的相应代码是201。通常,响应正文将包含新创建的资源的ID或URL。

  

10.2.2 201创建

     

请求已经完成并导致新资源出现   创建。 URI可以引用新创建的资源   在响应的实体中返回,具有最具体的URI   Location头字段给出的资源。应该回应   包括一个包含资源特征和列表的实体   用户或用户代理可以从中选择最多的位置   适当。实体格式由给定的媒体类型指定   Content-Type标头字段。原始服务器必须创建   返回201状态代码之前的资源。如果行动不能   立即执行,服务器应该回复202(已接受)   反而回应。

但是,您还可以使用更通用的状态代码200来表示成功:

  

10.2.1 200 OK

     

请求已成功。随响应返回的信息   取决于请求中使用的方法,例如:

     

获取与所请求资源相对应的实体   响应;

     

HEAD与所请求资源相对应的实体标头字段   在没有任何消息体的情况下在响应中发送;

     

POST一个描述或包含行动结果的实体;

     

跟踪包含结尾收到的请求消息的实体   服务器

要传达失败,您可能会使用4xx5xx范围内的代码。

4xx表示失败在客户端。例如,客户端未发送所有必需属性来创建资源。通用400非常方便:

  

10.4.1 400错误请求

     

由于格式错误,服务器无法理解该请求   句法。客户端不应该重复请求   修改

但是,5xx表示您的服务器在完成请求时遇到了问题。

  

10.5.4 503服务不可用

     

由于a,服务器当前无法处理请求   临时超载或维护服务器。这意味着   这是一个暂时的条件,一些后会缓解   延迟。如果已知,延迟的长度可以用a表示   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网络服务来测试响应代码。只需将所需的响应代码附加到URL,它将返回一个模拟答案。例如,成功:http://httpstat.us/200

答案 1 :(得分: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);
}