ASP.Net MVC4 HandleError未指定渲染视图

时间:2015-12-03 22:01:08

标签: asp.net-mvc razor exception-handling

我有一个控制器Action,其视图与我的应用程序的其余部分截然不同,我希望该Action抛出的任何异常都显示与我的应用程序的其余部分不同的错误页面。

我修改了HandleError属性,但是在发生异常时根本没有加载错误页面。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
        if(drawerLayout.isDrawerOpen(Gravity.END)) {
            drawerLayout.closeDrawer(Gravity.END);
        }
        else {
            drawerLayout.openDrawer(Gravity.END);
        }
        return true;
    }
    ...

    return super.onOptionsItemSelected(item);
}

有什么想法吗?

更新

好的,修改为:

    [HttpPost]
    [HandleError(View = "UPI_Error")]
    public ActionResult ParticipantUpdate1(Participant part)
    {
        try
        {
            mps.ParticipantUpdate(LogonTicket, ParticipantID, part);
        }
        catch(Exception ex)
        {
            string x = ex.Message;
        }
        return View();
    }

但是,它仍然没有加载UPI_Error页面。 ParticipantUpdate调用抛出此异常:

[HttpPost]
[HandleError(View = "UPI_Error", ExceptionType = typeof(ArgumentException))]
public ActionResult ParticipantUpdateSuccess(Participant part)
{
    // Copy the new stuff into the original ParticipantInfo before updating essentially "merging"
    Participant OrigPart = CopyParticipant(part);
    try
    {
        string result = mps.ParticipantUpdate(LogonTicket, ParticipantID, OrigPart);
        if (result != "Update Success")
        {
            throw new ArgumentException(result);
        }
    }
    catch (Exception e)
    {
        throw new ArgumentException(e.Message);
    }
    return View();
}

在此链接的文章中:http://www.c-sharpcorner.com/UploadFile/ff2f08/exception-or-error-handling-in-Asp-Net-mvc-using-handleerror/

它表示System.ServiceModel.FaultException`1 was unhandled by user code HResult=-2146233087 Message=ORA-12899: value too large for column "CLI"."CLI_MAIN_ZIP" (actual: 21, maximum: 11) 无法捕获控制器之外引发的异常。由于异常发生在我的Web服务中并传播到我的应用程序,这可能是问题的一部分吗?

但是当我从Web服务中捕获一个新异常时,我会抛出一个新异常,它仍然显示YSOD与我的自定义错误页面。

更新

好的,我决定走另一条路。我捕获异常,将异常对象复制到TempData,然后调用我的自定义视图。但是,由于某种原因,我无法更改视图中的布局。它带来了一个空引用异常。还有更多想法吗?

HandleError

抛出异常:

Message =对象引用未设置为对象的实例。   堆栈跟踪:        at ASP._Page_Views_Home_UPIError_cshtml.Execute()in ... \ Views \ Home \ UPIError.cshtml:第4行

以下是我视图中的第4行(是,视图存在于共享文件夹中):

[HttpPost]
[HandleError(View = "UPI_Error")]
public ActionResult ParticipantUpdateSuccess(Participant part)
{
    bool error = false;
    // Copy the new stuff into the original ParticipantInfo before updating essentially "merging"
    Participant OrigPart = CopyParticipant(part);
    try
    {
        string result = mps.ParticipantUpdate(LogonTicket, ParticipantID, OrigPart);
        if (result != "Update Success")
        {
            throw new ArgumentException(result);
        }
    }
    catch (Exception ex)
    {
        error = true; //  throw new ArgumentException(e.Message);
        TempData["exception"] =  ex;
    }
    if (!error)
    {
        return View();
    }
    else
    {
        return RedirectToAction("UPIError"); 
    }
}

public ActionResult UPIError()
{
    ViewBag.Exception = TempData["exception"];
    return View();
}

有一个View命名问题,但是解决了这个问题。现在,我仍然得到Null Reference异常,但视图就在那里并正确命名。

4 个答案:

答案 0 :(得分:-1)

要使自定义错误页面起作用,应正确配置web.config。在<system.web>中,此设置必须存在:

<customErrors mode="On" defaultRedirect="Error"/>

自定义视图必须存在于控制器的“视图”文件夹中或“共享”文件夹中。

下一个操作(在HomeController上)演示了这一点。如果您将此操作的id设置为0,则会抛出ArgumentException,从而显示自定义ContactError视图。如果您将id设置为1来调用它,它将显示默认的Error视图。如果您使用大于1的ID调用它,则会显示“联系人”视图

[HandleError(View = "ContactError", ExceptionType = typeof(ArgumentException))]
public ActionResult Contact(int id)
{
    if (id == 0)
    {
        throw new ArgumentException();
    }
    if (id == 1)
    {
        throw new NotImplementedException();
    }

    ViewBag.Message = "Your contact page.";
    return View();
}

答案 1 :(得分:-1)

在错误处理程序中,您指定要将自定义错误视图用于类型ArgumentException的异常,而当前引发的异常为System.ServiceModel.FaultException。您是否尝试过捕获更高级的Exception类,如:

[HandleError(View = "UPI_Error", ExceptionType = typeof(Exception))]

或者更具体地说是测试你的案例:

[HandleError(View = "UPI_Error", ExceptionType = typeof(System.ServiceModel.FaultException))]

答案 2 :(得分:-1)

只要您执行以下操作,这应该可以正常工作

在web.config文件中打开了

customErrors

<system.web>
  <customErrors mode="On" />
</system.web>

您已使用HandleError操作过滤器修饰了方法并指定了视图名称。

[HandleError(View="MyError")]
public ActionResult ErrorTest()
{       
    throw new ArgumentException("Just-Throw-An-Exception");
    return View();
}

您的MyError.cshtml~/Views/{YourCurrentControllerName}目录中有~/Views/Shared/剃刀视图。

答案 3 :(得分:-1)

您正在捕获异常但不会在catch clouse中抛出新异常。您不应该捕获异常,或者您应该抛出异常以让应用程序显示错误页面。

如果您在catch try catch中捕获异常,则会从catch范围中阻止您的代码计数,并且不会抛出任何错误。

您需要抛出一个错误,而不是通过try catch block ro get错误页面捕获。