Asp.net mvc 关于ASP.net MVC中Ajax请求错误处理的疑问

Asp.net mvc 关于ASP.net MVC中Ajax请求错误处理的疑问,asp.net-mvc,ajax,asp.net-mvc-3,iis,iis-7,Asp.net Mvc,Ajax,Asp.net Mvc 3,Iis,Iis 7,几天来,我一直在本地计算机上使用VisualStudio2010开发web应用程序。昨天晚上,我将我的应用程序部署在IIS7上,令人沮丧的是,我偶然发现了一个主要的节目阻碍者。问题与Ajax请求中的错误处理有关。首先,我有一些基于ajax请求的编辑屏幕。下面是ajax编辑屏幕的ajax部分的外观 @using (Ajax.BeginForm("_CityEdit", null, new AjaxOptions { HttpMethod = "Post", UpdateTargetId = "co

几天来,我一直在本地计算机上使用VisualStudio2010开发web应用程序。昨天晚上,我将我的应用程序部署在IIS7上,令人沮丧的是,我偶然发现了一个主要的节目阻碍者。问题与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 -->
}
从上面的代码可以看出,我返回了PartialView,如果它包含模型错误,它们将自动显示在Ajax编辑屏幕上。然后在“OnError”JavaScript中,我只是用控制器返回的PartialView替换相关div,如下所示

function onError(xhr) {
    $('#content').html(xhr.responseText);
}
这一切在我的开发机器上都非常有效。当我在IIS 7上部署应用程序并从windows XP框(使用IE 8或Chrome)访问它时,浏览器只显示默认的“500内部服务器错误”屏幕,而不是PartialView。所以我有一些疑虑,导致我昨晚睡不好

  • 我用于Ajax编辑的方法是否合理。如果不是的话,还有什么其他方法可以处理Ajax编辑(能够显示模型错误)

  • 由于我开发这些模块已经有几天了,并且已经付出了相当大的努力,所以有没有什么办法可以让它在xpbox上工作呢。基本上,若我能以某种方式阻止浏览器显示默认的“500内部服务器错误”屏幕,那个就太理想了

  • 这种方法是否适用于windows 7,因为我在浏览站点时使用的同一台windows 7计算机上安装了IIS 7,或者只是它适用于windows 7

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

    编辑: 我已经找到了解决问题的办法。这就意味着第二和第三个疑问得到了回答。基本上,web.config中的以下条目会阻止浏览器显示网站的默认浏览器页面

      <system.webServer>
          <httpErrors errorMode="Detailed"/>
      </system.webServer>
    
    
    
    但这仍然排除了我的第一个疑问。我是否使用了合理的Ajax编辑方法


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

    然而,我又一次进退两难,究竟是采用这种方法,还是重新编写整个应用程序。出现的问题是,如果某个模块在500内部服务器上出现故障,那么当errorMode设置为“Detailed”时,我的代码就会在浏览器中公开。因此,当我将响应错误代码设置为500时,我需要某种方法来提供我的自定义响应,如果应用程序的任何其他部分失败(我不是设置500状态代码的人),那么应该发送默认错误页,而不是通过“详细”响应公开我的代码。请帮忙

    问候,,
    NIrvan.

    IIS 7中新增:如果您的web.config的customErrors设置为on(或remoteOnly,并且您是远程的),则必须设置为true才能覆盖IIS的错误页设置。请参阅详细的错误页将解决您的问题。你的意思是整个页面被错误屏幕取代,而不是内容div?这是否也更新了浏览器中的当前URL?这听起来更像是AJAX调用本身失败了,因为它永远不会导致正常的GET/POST——它应该只通过JS进行渲染。我认为您的技术是可以接受的,因为您无论如何都无法防止500个AJAX调用-
    OnError
    应该足以处理它们。我认为您应该首先找出
    OnError
    在部署的环境中不工作的原因。@bzlm,我很确定当我将响应状态设置为500时,浏览器忽略了我从控制器返回的对给定ajax请求的整个响应。不知何故,浏览器显示了自己的“500内部服务器错误”屏幕。但您是对的,只有content div的内容被“500 Internal Server Error”页面替换。html页面的其他部分与以前一样。但是,我还是不得不阻止浏览器弹出错误页面,事实上,“错误模式”解决了这个问题。就我所知,我没有在我的申请表中更改任何其他内容。谢谢。@bzlm,这是我找到解决方案的地方。我懂了。听起来GoDaddy实际上并没有向浏览器返回HTTP状态代码500,因为您的
    OnError
    处理程序没有启动。我猜他们使用的基本Web.config或IIS设置被
    httpErrors errorMode
    覆盖,其副作用是响应代码实际上是500。总而言之,我想说你的技术是可靠的,但它需要一直验证到IIS,以确保你在操作中设置的HTTP状态代码实际上被转发到浏览器。@bzlm,我根本没有使用GoDaddy。只有IIS和Asp.net MVC。如果“http errorMode”未设置为“Detailed”,则仍会出现500个内部服务器错误。所以这似乎与IIS有关。无论如何,我非常感谢你研究我冗长的问题,并就我的方法提出你的意见。干杯
      <system.webServer>
          <httpErrors errorMode="Detailed"/>
      </system.webServer>