首页 > 解决方案 > 检查后端后显示错误消息

问题描述

我的控制器是这样的:

 [HttpPost]
    [Route("Somewhere")]
    public JsonResult SetSomething(string propertyName, string propertyValue)
    {
        var successSave = this.SaveIt(propertyName,propertyValue);

        if(successSave)
            return Json(propertyValue);
        else 
           // Show a message in front end that there was problem in saving 
    }

然后我的观点目前是这样的:

@Model.SomethingFeild

这只是加载该值并将其显示在其中的文本框字段中。那么如何更改它以能够处理我在控制器中编写的伪代码场景,以便如果数据库中有问题(不是前端 vlaidation),例如重复条目,那么它会回来并UI告诉所以UI显示一个硬编码的消息?

标签: asp.net-mvc

解决方案


将它包装在 try catch 块中并添加一个扩展方法来读取异常(或抛出的异常类型),如下所示:

[HttpPost]
    [Route("Somewhere")]
    public JsonResult SetSomething(string propertyName, string propertyValue)
    {
        try
        {
            var successSave = this.SaveIt(propertyName, propertyValue);

            if (successSave)
                return Json(new { success = true, value = propertyValue });
        }
        catch (Exception ex)
        {
            return Extensions.ReturnExceptionToView(ex);
        }

    }

示例扩展方法(静态方法):

internal static JsonResult ReturnExceptionToView(Exception ex)
    {
        List<object> viewErrors = new List<object>();
        viewErrors.Add(new { ErrorMessage = ex.ToString() });
        return new JsonResult() { Data = (new { success = false, errors = viewErrors }) };
    }

然后在 JS 的响应中检查成功属性。下面的示例是使用 ajax 调用的响应并推送到 Knockout 可观察数组。

if (response.success) {
            // do something with successful response
        } else {
            // we have an error in the response.errors collection
           $.each(response.errors, function () {
                    vm.saveErrors.push(new ErrorMsg(this.ErrorMessage));
            });

推荐阅读