如何通过JSON在ASP.NET MVC 3.0中返回错误的正确响应?

时间:2011-06-23 15:06:22

标签: json asp.net-mvc-3 jquery error-handling

我正在努力解决这个问题。在我的本地计算机(Win7 / VS2010 / IIS 7.5)和另一台相同开发人员的计算机上,以下代码返回500状态代码,响应文本显示“无法找到具有指定电子邮件地址的用户”。

当我将站点部署到我的测试服务器(Win2008 R2 / IIS7.5)时,它会返回正确的状态代码,但内容类型设置为“text / html”,而responseText不包含该消息。< / p>

我已经尝试关闭服务器上的自定义错误,这没有任何区别。谁能发现问题可能是什么?

我有一个使用AjaxHelper.BeginForm方法配置的表单:

@using (Ajax.BeginForm("FindUser", new AjaxOptions {OnSuccess="findComplete", OnFailure="findFailed"}) 
{
    <fieldset>
        @Html.EditorFor(m => m.UserEmail)
        <div class="form-item button search">
            <input type="submit" value="Find"/>
        </div>
        <div id="find-err" class="message error hidden">
            <div class="contents"></div>
        </div>
    </fieldset>
}

使用错误处理javascript函数:

function findFailed(result) {
    var error = result.responseText;
    if (error) {
        $('#find-err .contents').text(error).slideDown();
    }
}

控制器操作捕获任何错误并返回消息:

[HttpPost]
public ActionResult FindUser(FindUserModel model) 
{
    try
    {
        // code to find user

        if (user == null) 
        {
            throw new Exception("Could not locate user with specified email address.");
        }

        if (Request.IsAjaxRequest())
        {
            return Json(new { id = user.Id, name = user.Name }, JsonRequestBehavior.AllowGet);
        }

        model.FoundUser = user;
        return View("Details", model);
    }
    catch (Exception ex)
    {
        if (Request.IsAjaxRequest())
        {
            Response.StatusCode = 500;
            return Json(ex.Message, JsonRequestBehavior.AllowGet);
        }

        ModelState.AddModelError("UserEmail", ex.Message);
        return View(model);
    }
}

非常感谢任何帮助:)

1 个答案:

答案 0 :(得分:15)

看起来IIS正在吃响应并试图用它做自定义错误。

尝试设置

Response.TrySkipIisCustomErrors = true

在你的捕获中。

或者设置以下配置值:

<httpErrors errorMode="Custom" existingResponse="PassThrough"/>