我一直在使用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();
}
答案 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一个描述或包含行动结果的实体;
跟踪包含结尾收到的请求消息的实体 服务器
要传达失败,您可能会使用4xx
或5xx
范围内的代码。
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);
}