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

#1楼 票数:4 已采纳

使用旧的常规HTTP状态代码来传达您API上的操作结果可能是一个好主意。

创建资源时传达成功的适当代码是201 通常,响应主体将包含新创建资源的ID或URL。

10.2.2 201已创建

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

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

10.2.1 200 OK

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

在响应中发送与请求的资源相对应的实体;

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

发布一个描述或包含操作结果的实体;

跟踪包含最终服务器接收到的请求消息的实体。

为了传达故障,您可能会使用4xx5xx范围内的代码。

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

#2楼 票数: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);
}

  ask by chickenricekid translate from so

未解决问题?本站智能推荐:

1回复

处理未处理的异常MVC4 C#剔除和Ajax

我正在使用淘汰赛,并使用下面给出的自定义函数对控制器进行ajax调用。 如果发生任何无法处理的异常,它将返回整个页面作为响应,并在响应时显示页面的整个html,请提出正确的处理方法 我的调用函数是 我正在使用asycComputed函数进行ajax调用,如果任何ajax调用都出
1回复

MVC控制器将JSON对象日期属性“更改”为“现在”

作为ASP.NET MVC4 Web应用程序的一部分,我有一个带有“保存”功能的客户端Javascript Viewmodel,该功能可过帐到控制器: 一旦“成功”,客户端期望的数据包含使用KnockoutJS重新映射的原始视图模型。 以下服务器端视图模型是映射的蓝图: 注意D
1回复

解决MVC 4控制器的Knockout JSON模型问题

所以我有一个ViewModel: 返回List<PrelimViewModel> GetPrelim控制器方法 PrelimViewModel客户端列表的ko.mapper: 做一些工作,准备保存: 我无法让我的MVC方法解析JSON:
2回复

使用MVC在Knockout js中的页面之间导航

我需要使用MVC 4和Knockout构建应用程序。 在那我有4个菜单。 我为每个菜单创建了四个不同的视图。 当我单击菜单时,页面正在正确重定向,并且每个页面中的所有功能都起作用。 但是,问题是,当我在菜单之间导航时,整个页面都会刷新。 在每个页面中,我都使用了剔除法来执行诸如
2回复

在MVC4视图中使用KnockOut JS绑定两个ViewModels

我正在使用淘汰赛3.3.0。 在我的应用程序中,我有通用的javascript文件,该文件遍历整个应用程序。 除此之外,我将为每个页面创建单独的Js文件。 因此,我有两种视图模型,一种是通用的,另一种是页面级的viewModel页面级的一种视图模型。 我的两个Js文件的所有功能都是a
1回复

请求的资源不支持http方法'GET'ASP MVC

我有一个MVC api并使用控制器来访问我的数据,但我使用ajax和knockoutjs来调用我的方法,但我收到以下错误:请求的资源不支持http方法'GET'。 我尝试在我的控制器方法的顶部使用[HttpGET],但它仍然无法正常工作。 我不知道如何解决这个问题。 敲我的api调用V
1回复

js文件中的JSON调用返回NetworkError:404 Not Found

我在我的应用程序中使用asp.net mvc 4,knockout-js。 我想问一下如何从js文件调用控制器? 当我将此代码写入视图(剃刀)页面时,它起作用: 现在我想在* .js文件中进行通话。 问题是Url.Action在js文件中无效。 我在global.asax
1回复

如何使knockout.js中的ViewModel绑定到从WebAPI返回的匿名集合?

下面的代码适合我 但我想制作一个ViewModel,它可以在调用AJAX Request时直接与JSON对象绑定。 而不是每次都为每个可观察的值分配值,ViewModel可以作为集合进行优化吗?