【问题标题】:ASP MVC3 HandleError on an HttpPostHttpPost 上的 ASP MVC3 HandleError
【发布时间】:2012-03-08 06:03:31
【问题描述】:

更新帖子以反映@Kate 建议的部分修复。原帖低于新帖:

我有对 HttpPost Action 方法的 Ajax 调用。如果该方法毫无例外地执行,我希望它将其数据作为部分视图加载到 div 元素中(它成功地执行了此操作)。如果有异常,我希望它加载 asp mvc 错误视图作为全页视图。但是,对于下面的代码,异常会导致错误视图作为部分视图加载到所述 div 元素中。我必须在我的控制器之外留下一些东西......

[HttpPost]
[HandleError]
public ActionResult LoadUnmappedProjects()
{
    bool error = false;
    try
    {
        throw new ArgumentException();
    }
    catch (Exception e)
    {
        error = true;
    }

    if (!error)
        using (var db = new prismEntities())
        {
            return PartialView(db.dmPSPProjectStatewideRegionals.ToList());
        }
    else
    {
        return View("Error");
    }   
}

想法???

原帖

在 ASP MVC3 Web 应用程序中,我有一个 ajax 调用和 [HttpPost] 操作方法。该方法命中数据库并将数据返回到局部视图。如果数据库或感兴趣的表已关闭,我想返回错误视图。但我似乎无法在方法上结合 [HttpPost] 和 [HandleError] 来实现这一点:

    [HttpPost]
    [HandleError]
    public ActionResult LoadUnmappedProjects()
    {

        try
        {
            throw new ArgumentException();
        }
        catch (Exception e)
        {
            throw new CustomDbException(e);
        }

        using (var db = new prismEntities()){
        return PartialView(db.dmPSPProjectStatewideRegionals.ToList());
        }


    }

库存的 Error.cshtml 未呈现。相反,Ajax 调用返回了一个错误,目前我只是弹出一个 alert()。我可以对上面的方法做些什么来导致错误视图呈现吗?或者我应该使用 Ajax 调用中返回的错误来以某种方式呈现错误视图?

这是我的 ajax 调用:

$.ajax({
    url: pathLoadUnmappedProjects,
    type: 'POST',
    dataType: 'html',
    contentType: 'application/json; charset=utf-8',
    success: function (result) {
        $('#unmappedProjects').html(result);
    },

    error: function () {

        alert("Error:");
    }
});

【问题讨论】:

    标签: ajax asp.net-mvc razor error-handling


    【解决方案1】:

    问题出在您的代码中。因为您抛出异常,它会自动停止进程并返回 500 错误服务器(您可以检查 Firebug 中的 Net 选项卡以查看它)。所以,我的建议是不要在这里抛出异常:

    throw new ArgumentException();
    
    You can something like that:
    try
    {
         ...
    }
    catch (Exception e)
    {
        error = true;
    }
    if (error)
    {
    // render Error page
    }
    

    如果您需要重定向到某个页面,只需尝试返回您想要重定向到的页面名称并在 JS 代码中执行,如下所述:How to reload page when an ajax request returns FormsAuthentication.RedirectToLoginPage?

    所以你的代码看起来像:

    error: function () {
    
            window.location.href = "Error/Index";
        }
    

    在这种情况下,您可以像以前一样抛出异常,ajax 代码将捕获错误响应并重定向。

    【讨论】:

    • 谢谢,解决了部分问题,但不是全部。 Action 方法执行成功,但将错误视图作为部分视图返回...我想将其呈现为整个页面。我错过了其他东西......
    • 请指定您希望如何呈现该错误页面 - 作为您的 Ajax 请求的一部分,或者您只想重定向到其他页面。
    • 谢谢。实际上我可以看到这两个选项的需要(在 Ajax 中渲染页面和重定向)。多亏了这里的出色反馈,我将同时实施。
    【解决方案2】:

    我认为您无法通过您的 LoadUnmappedProjects 操作来实现这一点,因为您正在进行 Ajax 调用。在您的情况下,返回的错误页面被视为正常页面,因此您的 ajax 位的“成功”部分被执行。

    我宁愿尝试返回一些标志(代码、空字符串等),以防出现异常,并在“成功”部分检查并重定向到错误页面(如果你真的想这样做) 来自 jQuery。

    【讨论】:

      【解决方案3】:

      您仍然可以返回状态码 500 并让 AJAX 调用处理错误。

      你的行动:

       public ActionResult LoadUnmappedProjects() 
       { 
           bool error = false; 
           try 
           { 
               throw new ArgumentException(); 
           } 
           catch (Exception e) 
           { 
               error = true; 
           } 
      
           if (!error) 
               using (var db = new prismEntities()) 
               { 
                   return PartialView(db.dmPSPProjectStatewideRegionals.ToList()); 
               } 
           else 
           { 
               Response.StatusCode = 500;
               return View("Error"); 
           }    
       } 
      

      然后是你的 AJAX 调用:

      $.ajax({      
          url: pathLoadUnmappedProjects,      
          type: 'POST',      
          dataType: 'html',      
          contentType: 'application/json; charset=utf-8',      
          success: function (result) {      
              $('#unmappedProjects').html(result);      
          },      
      
          error: function (xhr, ajaxOptions, thrownError) {
               $('html').html(xhr.responseText);
          }     
      }); 
      

      我自己会处理错误,显示一些消息而不显示完整的错误页面,但选择权在你。 Kate 的回答也很中肯,将 URL 更改为错误页面的 URL。

      【讨论】:

      • 感谢您的解决方案,它也很有帮助。
      猜你喜欢
      • 2012-02-20
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多