asp.net-mvc - 与 ASP.net MVC 中 Ajax 请求中的错误处理有关的疑问

标签 asp.net-mvc ajax asp.net-mvc-3 iis iis-7

几天来,我一直在使用 Visual Studio 2010 在本地计算机上开发 Web 应用程序。昨晚我在 IIS 7 上部署了我的应用程序,令人沮丧地偶然发现了一个主要的显示障碍。该问题与 Ajax 请求中的错误处理有关。首先,我有一些适用于 ajax 请求的编辑屏幕。这是 Ajax 编辑屏幕的 ajax 部分的样子。

@using (Ajax.BeginForm("_CityEdit", null, new AjaxOptions { HttpMethod = "Post", UpdateTargetId = "content", 
                                                            LoadingElementId="imgSaveLoading", OnFailure="onError",
                                                            OnSuccess = "onSuccess" }, new { id = "frmCity" })) {
    <img id="imgSaveLoading" alt="loading" src="@Url.Content("~/Content/Telerik/Vista/loading.gif")" class="ajax-loader-user" />
    <div class="content" id="content">
        @{Html.RenderPartial("_CityEdit");}   
    </div>

    <!-- Some Other code here -->
}

我依赖于上述 Ajax.BeginForm() 的“onError”回调。所以在我的 Controller 中,每当我想向用户显示错误(模型错误或任何其他错误)时,我只是乐观地将服务器响应设置为 500(内部服务器错误),希望这会导致 Ajax.BeginForm 的“OnError”处理程序() 被调用。这是我如何在 Controller 中执行此操作的片段。
[HttpPost]
public ActionResult _CityEdit(CityViewModel viewModel) {
    city = cityManager.FindCity(viewModel.City.Id, false);
    // Validate Model here 
    if (!TryUpdateModel(city, "City")) {
        Response.StatusCode = 500;
        return PartialView("_CityEdit", viewModel);
    }

从上面的代码可以看出,我返回了 PartialView,如果它包含模型错误,它们将自动显示在 Ajax 编辑屏幕上。然后在“OnError”JavaScript 中,我只需将相关的 div 替换为 Controller 返回的 PartialView,如下所示。
function onError(xhr) {
    $('#content').html(xhr.responseText);
}

这一切在我的开发机器上都很好用。当我在 IIS 7 上部署我的应用程序并从 Windows XP 框(使用 IE 8 或 Chrome)而不是 PartialView 访问它时,浏览器只显示默认的“500 内部服务器错误”屏幕。所以我有几个疑虑导致我昨晚睡不好。
  • 我用于 Ajax 编辑的方法是否合理。如果不是其他方式,我可以处理 Ajax 编辑(能够显示模型错误)。
  • 由于我已经开发这些模块几天并且付出了相当大的努力,是否有任何变通方法可以让它在 XP box 上运行。基本上,如果我能以某种方式阻止浏览器显示其默认的“500 内部服务器错误”屏幕,那将是理想的。
  • 这种方法是否适用于 windows 7,因为我在用于浏览站点的同一台 windows 7 机器上安装了 IIS 7,或者它只是它适用于 windows 7。

  • 如果有其他建议,请继续。

    编辑:
    我找到了解决我的问题的方法。所以这意味着没有回答 2 和 3 的疑问。基本上,web.config 中的以下条目会阻止浏览器显示网站的默认浏览器页面。
      <system.webServer>
          <httpErrors errorMode="Detailed"/>
      </system.webServer>
    

    但这仍然排除了我的第一个疑问。我是否使用了合理的 Ajax 编辑方法?

    我用 fiddler 检查了响应,是 IIS 发送了服务器错误 500 的默认错误页面。因此需要将其配置为返回“详细”响应。我们可以使用 IIS 管理器来做到这一点。我遵循的另一个选项是在应用程序的 web.config 文件中的应用程序级别定义它。

    然而,我又陷入了两难境地,是采用这种方法还是重新编写整个应用程序。出现的问题是,如果确实有一些模块因 500 内部服务器而失败,我的代码会在浏览器中暴露,因为 errorMode 设置为“详细”。因此,当我将响应错误代码设置为 500 并且如果应用程序的任何其他部分失败(我不是设置 500 状态代码的那个)时,我需要一些方法来提供我的自定义响应,那么应该发送默认错误页面而不是公开我的代码通过“详细”响应。请提供任何帮助。

    问候,
    尼文。

    最佳答案

    IIS 7 中的新功能:您必须设置 HttpResponse.TrySkipIisCustomErrors如果您的 web.config 的 customErrors 设置为 on(或 remoteOnly 并且您是远程的),则设置为 true 以覆盖 IIS 的错误页面设置。参见 this answer

    关于asp.net-mvc - 与 ASP.net MVC 中 Ajax 请求中的错误处理有关的疑问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7453325/

    相关文章:

    JavaScript/JQuery 在加载了 load() 的 html 中不起作用

    javascript - Ajax 调用 MVC Controller - URL 问题

    asp.net - 从 MVC 4 项目授权 ASMX .NET Web 服务的正确方法

    asp.net-mvc - 如何在 MVC 中使用 RedirectToRoute ("routeName")?

    javascript - 响应在 ajax 自动完成内不起作用

    javascript - ASP.NET MVC 实现自定义验证器使用 IClientValidatable

    asp.net - 无法将数据从 SecurityAttribute 类传递到 MVC3 中的 Controller

    c# - 从 mvc Controller 调用远程 Web api

    c# - 下拉菜单不工作 MVC C# Razor

    jquery - 在不重新加载页面的情况下更新浏览器的 URL