【问题标题】:Can't get defaultRedirect to work无法让 defaultRedirect 正常工作
【发布时间】:2011-09-06 21:39:14
【问题描述】:

在我的 web.config 中,我有:

<system.web>
    <customErrors mode="On" defaultRedirect="Error.cshtml" />
</system.web>

在 Views/Shared/Error.cshtml 中,我有:

@model System.Web.Mvc.HandleErrorInfo
@{
    ViewBag.Title = "Error";
}
<h2>
    Sorry, an error occurred while processing your request.
</h2>

如果我在浏览器中输入了无效的 URL/路由,我会得到:

“/”应用程序中的服务器错误。

找不到资源。

描述:HTTP 404。您要查找的资源(或其依赖项之一)可能已被删除、名称已更改或暂时不可用。请检查以下 URL 并确保其拼写正确。

请求的 URL:/Error.cshtml

为什么找不到Error.cshtml?该文件肯定在 Views/Shared 中。

【问题讨论】:

标签: asp.net-mvc asp.net-mvc-3


【解决方案1】:

defaultRedirect 不会直接转到视图。您的 defaultRedirect 看起来像一个无法处理的剃刀视图文件。例如:它从哪里得到模型?它没有也不能在配置文件中指定,因此它无法处理视图。

如果您想在 MVC 中获得更多动态错误页面,您可能需要阅读 custom error pages and error handling in MVC 3

【讨论】:

  • 您的答案与此答案相矛盾:stackoverflow.com/a/13905859/507339。从我的测试中,我实际上体验到一个类型为 HandleErrorInfo 的模型确实是由框架注入的。您可能需要在 web.config 中删除“.cshtml”扩展名
  • @Colin - 如果在 FilterConfig 中注册了全局错误处理程序(例如 filters.Add(new HandleErrorAttribute());)应该没有问题。控制器对于视图的存在没有 1:1 的要求。按照惯例就是这样。
【解决方案2】:

它对我有用。只需在 web.config 中进行此更改:

<system.web>
    <customErrors mode="On" defaultRedirect="~/Views/Shared/Error.cshtml">
    </customErrors>
</system.web>

【讨论】:

  • 这几乎对我有用。我不得不删除 .cshtml:defaultRedirect="~/Public/Error" 是我需要的。
【解决方案3】:

将您的 web.config 编辑为:

<system.web>
    <customErrors mode="On" defaultRedirect="/Home/Error" />
</system.web>

如果你使用 asp.net mvc 1.0 或 2.0,你应该为每个控制器添加 HandleError 属性:

[HandleError]
public class HomeController: Controller
{
    public ActionResult Error()
    {
        return View();
    }
}

如果你使用 asp.net mvc 3.0:

public class MvcApplication : System.Web.HttpApplication
{
        protected void Application_Start()
        {
            GlobalFilters.Filters.Add(new HandleErrorAttribute());
        }
}

【讨论】:

  • 谢谢,但这不起作用。我收到 /Home/Error 的“找不到资源”错误。我正在使用 ASP.NET MVC 3,并且我已经添加了 HandleErrorAttributes 过滤器。
  • 在 /your-web-root/Views/Home/ 中是否有“错误”视图名称?
  • 你不需要 ~ 吗,就像 Rajesh 的回答一样?我做到了。
【解决方案4】:

您应该使用[HandleError] 属性标记您的控制器操作或将其注册为全局过滤器

编辑: 这是因为自定义错误的重定向功能属于 ASP.NET 基础结构并且对 ASP.NET MVC 一无所知。

您应该创建单独的控制器来管理重定向并在您的 Web.config 中指定它的 url。或者您可以创建静态 html 文件并将其放入根目录(或除 Views 目录之外的任何其他位置)

【讨论】:

  • 没什么区别...它仍然说找不到Error.cshtml。如果用户输入的 URL 甚至不包含有效的控制器怎么办?
  • 啊,现在我明白了。您应该创建单独的控制器来管理重定向并在您的 Web.config 中指定它的 url。或者你应该创建静态 html 文件并且不要把它放到 Views 文件夹中
【解决方案5】:

一种解决方案是创建 ErrorController

public class ErrorController : Controller
{
    //
    // GET: /Error/

    public ActionResult Error()
    {
        return View();
    }

    public ActionResult Error404()
    {
        return View("Error");
    }

}

更改 Web.config

【讨论】:

    猜你喜欢
    • 2012-09-05
    • 2017-11-06
    • 1970-01-01
    • 2023-03-10
    • 2020-10-16
    • 2014-01-15
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多