从控制器显示UI中的错误

时间:2017-11-19 13:41:27

标签: c# asp.net-mvc asp.net-mvc-4

我正在通过UI进行Ajax调用,如下所示

$.ajax({
                    type: "GET",
                    dataType: "json",
                    url: "api/ChangePassWord",
                    data: source,
                    success:
                        function (data) {
                            ChangePasswordSuccess(data);
                        },
                    error: function (err) {
                        Error(err);
                    }
                });

function Error(err) {
                alert(err.Error);
            }

我的控制器代码如下所示

    [HttpGet]
    public void ChangePassWord(string Email,string pwd)
    {
        try
        {
            //A call to WCF Service
            wcfClinetProxy.ChangePassWord(Email, pwd);
        }
        catch (Exception ex)
        {
            throw new Exception("Error while changing PassWord", new Exception(ex.InnerException.Message));
            //ModelState.AddModelError(string.Empty, ex.Message);
        }            
    }

从WebAPi控制器我正在调用WCF服务来更改PassWord.If PassWord没有足够的长度WCF服务将抛出异常的原因.In Controller我想捕获异常并在UI中显示为alert.Please建议我这样做的好方法。

2 个答案:

答案 0 :(得分:0)

如果您可以选择在JavaScript中验证输入,我建议您验证其中的长度。

编辑: 此外,也许这就是您所寻找的:https://msdn.microsoft.com/en-us/library/ee942778.aspx

答案 1 :(得分:0)

使用当前代码,当您的代码崩溃并点击catch块时,您将抛出一个新的异常。框架会将此异常详细信息发送回客户端。因此,从web api调用中获得的结果将是 500 内部错误状态的响应,响应正文具有异常详细信息

{
  "Message":"An error has occurred.",
  "ExceptionMessage":"Error while changing PassWord"
  "ExceptionType":"Some value for this",
  "StackTrace": "importane stack trace information here"
}

这有很多信息,包括Stacktrace。将这些信息暴露给客户端/最终用户可能不是一个好主意。您的公共端点应该向用户返回友好响应,而不是向他提供堆栈跟踪和异常详细信息。

由于响应不是 200 OK 响应,因此将调用error方法的$.ajax处理程序。

理想情况下,您应该做的是,始终返回您自己的自定义响应(具有200 OK状态),该响应具有客户端所需的信息。例如,如果一切顺利,请返回这样的回复

{ status: "success" }

如果代码命中了catch块,则返回类似

的内容
{ status: "failed", message: "failed to update password" }

此外,对于任何更新数据的内容,您的端点不应是GET端点。使其仅适用于http POST

public class ChangePasswordController : ApiController
{
    public class LoginVm
    {
        public string Email { set; get; }
        public string Pwd { set; get; }
    }

    [HttpPost]
    public HttpResponseMessage Post([FromBody] LoginVm vm)
    {
        try
        {
            wcfClinetProxy.ChangePassWord(vm.Email, vm.Pwd);
            return Request.CreateResponse(HttpStatusCode.OK,new {status = "success"});
        }
        catch (Exception ex)
        {
            // to do : Log the error (ex) to your error logs
            return Request.CreateResponse(HttpStatusCode.OK, 
                              new { status = "failed", message="failed t update" });
        }
    }
}

现在在客户端,您将对端点进行POST调用,当响应返回时,我们将检查status属性,如果status属性的值为failed,我们将向用户显示message属性值。

$.ajax({
    type: 'POST',
    url: 'api/ChangePassword',
    data: { email: 'scott', pwd: 'tiger' }
}).done(function (r) {
    if (r.status === 'failed') {
        alert(r.message);
    } else {
        alert("Updated successfully");
    }
}).fail(function (x, a, e) {
    console.log(x);
    console.log(a);
    console.log(e);
});