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

Jat*_*tin 6 iis ajax asp.net-mvc iis-7 asp.net-mvc-3

我使用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 -->
}
Run Code Online (Sandbox Code Playgroud)

我依赖于上面的Ajax.BeginForm()的"onError"回调.所以在我的控制器中,每当我想向用户显示错误(模型错误或任何其他错误)时,我只是乐观地将服务器响应设置为500(内部服务器错误),希望这会导致Ajax.BeginForm的"OnError"处理程序()被调用.这是我在控制器中如何做到这一点的片段.

[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);
    }
Run Code Online (Sandbox Code Playgroud)

从上面的代码可以看出,我返回了PartialView,如果它包含Model Errors,它们将自动显示在Ajax Edit屏幕上.然后在"OnError"JavaScript中,我只需用控制器返回的PartialView替换相关的div,就像这样.

function onError(xhr) {
    $('#content').html(xhr.responseText);
}
Run Code Online (Sandbox Code Playgroud)

这一切都在我的开发机器上运行良好.当我在IIS 7上部署我的应用程序并从Windows XP框(使用IE 8或Chrome)而不是PartialView访问它时,浏览器只显示默认的"500 Internal Server Error"屏幕.所以我有些疑惑让我昨晚睡不着觉.

  1. 我用于Ajax编辑的方法是否合理.如果不是可能的其他方式,我可以处理Ajax编辑(能够显示模型错误).

  2. 由于我现在已经开发了几天这些模块并付出了相当大的努力,有没有任何工作可以让它在XP机器上工作.基本上,如果我能以某种方式阻止浏览器显示其默认的"500内部服务器错误"屏幕,那将是理想的.

  3. 这种方法是否适用于Windows 7,因为我在用于浏览网站的同一台Windows 7机器上安装了IIS 7,或者它只适用于Windows 7.

如有任何其他建议,请继续.

编辑:我找到了解决问题的方法.这意味着怀疑没有回答2和3.基本上,web.config中的以下条目阻止浏览器显示网站的默认浏览器页面.

  <system.webServer>
      <httpErrors errorMode="Detailed"/>
  </system.webServer>
Run Code Online (Sandbox Code Playgroud)

但这仍然是我的第一个怀疑.我是否使用了合理的Ajax编辑方法?


我检查了与fiddler的响应,并且是IIS发送了服务器错误500的默认错误页面.所以它需要配置为返回"详细"响应.我们可以使用IIS管理器来完成此操作.我所关注的另一个选项是在应用程序的web.config文件中的应用程序级别定义它.

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

问候,NIrvan.

Car*_*l G 0

IIS 7 中的新增功能:如果您的 web.config 的 customErrors 设置为 on(或 remoteOnly 并且您是远程用户),则必须将HttpResponse.TrySkipIisCustomErrors设置为 true 才能覆盖 IIS 的错误页面设置。请参阅此答案