簡體   English   中英

與ASP.net MVC中的Ajax請求中的錯誤處理有關的疑問

[英]Doubts relating to error handling in Ajax requests in ASP.net MVC

我使用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”回調。 所以在我的控制器中,每當我想向用戶顯示錯誤(模型錯誤或任何其他錯誤)時,我只是樂觀地將服務器響應設置為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);
    }

從上面的代碼可以看出,我返回了PartialView,如果它包含模型錯誤,它們將自動顯示在Ajax編輯屏幕上。 然后在“OnError”JavaScript中,我只需用控制器返回的PartialView替換相關的div,就像這樣。

function onError(xhr) {
    $('#content').html(xhr.responseText);
}

這一切都在我的開發機器上運行良好。 當我在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>

但這仍然是我的第一個懷疑。 我是否使用了合理的Ajax編輯方法?


我檢查了與fiddler的響應,並且是IIS發送了服務器錯誤500的默認錯誤頁面。所以它需要配置為返回“詳細”響應。 我們可以使用IIS管理器來完成此操作。 我所關注的另一個選項是在應用程序的web.config文件中的應用程序級別定義它。

然而,無論是采用這種方法還是重寫整個應用程序,我都處於兩難境地。 出現的問題是,如果確實有一些模塊因500內部服務器而失敗,我的代碼會在errorMode設置為“Detailed”時在瀏覽器中公開。 所以當我將響應錯誤代碼設置為500並且如果應用程序的任何其他部分失敗(我不是一個設置500狀態代碼)時,我需要一些方法來提供我的自定義響應,那么應該發送默認錯誤頁面而不是暴露我的代碼通過“詳細”回應。 請幫忙。

問候,NIrvan。

IIS 7中的新增功能:必須將HttpResponse.TrySkipIisCustomErrors設置為true才能覆蓋IIS的錯誤頁面設置(如果web.config的customErrors設置為on(或remoteOnly並且您是遠程的)。請參閱此答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM