繁体   English   中英

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

Alternatives to MVC Controller Actions returning strings?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我一直在关注使用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 个回复

使用旧的常规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

我最喜欢@ 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);
}
1 MVC 3控制器操作以JSON返回本地化的字符串

我目前正在研究基于MVC 3的项目。 该产品最近计划在加拿大发布,根据法律规定,所有网站都必须提供该副本的英语和法语版本。 基本体系结构包括:-本地化类库-MVC3应用程序-DAL-所有控制器都继承自基本的可本地化控制器类,该类将当前线程的CurrentCulture和CurrentUI ...

2 从MVC控制器返回JSON字符串

我使用以下代码将对象发送/接收到我的mvc控制器: }); 在我的mvc控制器上,我将我的JSON对象作为字符串,因此我不需要.NET JavascriptSerializer和JsonResult。 我的JSON字符串如下所示: 我总是得到:“无效的角色” 我 ...

3 我可以将替代返回链接传递给MVC控制器操作吗?

我有一个MVC5应用程序,它具有多个控制器,并带有EF6 CRUD操作和关联的视图。 这些控制器/视图集之一用于管理患者标识符表,并且在完成编辑或删除后,控制器会按预期将操作链接返回到标识符索引视图。 但是,患者标识符也显示在患者控制器的各种视图上,并且从Patient.Edit视图中显 ...

5 如何将字符串附加到mvc4中的控制器操作方法所请求的URL

我正在开发一个网站,其中包含一些使用MVC4和实体框架的教程。 所有教程都将保存在数据库中,并根据请求的URL中提供的教程ID(例如TId)将在action方法中检索有关该教程的所有信息,并在视图中呈现并显示给用户。 以下是示例网址。 网址:www.mysite.com/Tutoria ...

6 控制器操作方法返回字符串或使用ajax发布请求重定向到另一个操作

我通过jquery ajax发布调用MVC操作方法。 该操作方法将返回一个字符串值,或者如果操作方法中的某些条件为true,则它将重定向到另一个操作方法。 问题是,每当我尝试重定向到另一个动作方法时,ajax帖子都会执行错误块,并且每当动作方法返回字符串值时,它就可以正常工作。 我不想使用 ...

7 将查询字符串参数传递给MVC控制器中的JsonResult操作

我试图将查询字符串参数传递给控制器​​中的JsonResult操作。 我不断收到以下错误: 值不能为空。 参数名称:字符串 我需要此网址中的task_id: TaskIn?TASK_ID = 33 在我看来,我已经尝试过(失败并出现相同的错误): 在控制器中: ...

8 c#mvc呈现控制器的操作-通过字符串名称

我正在尝试使用MVC框架,以尝试一些概念证明。 这不是生产代码。 无论如何-我有一个匿名控制器。 我想在该控制器上执行一个动作,但是,我只有该控制器的动作名称可以作为字符串使用。 如何通过字符串名称呈现控制器的动作? 谢谢你们! 弗兰科 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM