如何将错误 404 路由到默认视图?
How to route Error 404 to a default View?
我有一个采用 .NET Core 1.1 和 MVC 架构的项目,
我想在不正确的 URL(状态代码:404;未找到)中重定向到我已经创建的错误视图。
在另一个只有一个控制器的项目中,我让它正常工作:
[Route ("/Home/Error")]
public IActionResult Error()
{
ViewBag.Title = "About Us";
return View();
}
[Route("/{a}/{*abc}")]
[HttpGet]
public IActionResult Err(string a)
{
return RedirectToAction("Error", "Home");
}
并且正在启动:
app.UseMvc(routes =>
{ routes.MapRoute(
name: "Default",
template: "{controller=Home}/{action=GetDocument}/{id?}");
});
但是如果在这个项目中,有 4 个控制器,在启动时使用这个配置:
app.UseMvc(routes =>
{ routes.MapRoute(
name: "Default",
template: "{controller}/{action}/{id?}",
defaults: new { controller = "Home", action = "IndexB" }
);
);
HomeController 或所有控制器上的这段代码(我都试过了):
[Route("/Home/Error")]
public IActionResult Error()
{
ViewBag.Title = "About Us";
return View();
}
[Route("/{a}/{*abc}")]
[HttpGet]
public IActionResult Err(string a)
{
return RedirectToAction("Error", "Home");
}
另一个项目中的第一个代码就像一个魅力,它会去它必须去的地方,但是如果不存在 URL 会转到错误页面。
但是在带有第二个代码的这个项目中,无论如何我总是被重定向到错误页面。
如果您重定向到 404 的默认视图,请在 Startup.cs
文件的 Configure
方法中添加自定义中间件委托。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.Use(async (context, next) =>
{
await next();
if (context.Response.StatusCode == 404)
{
context.Request.Path = "/home/notfound";
await next();
}
});
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
这里 app.Use(async (context, next) => ...
是您的 中间件委托 ,它检查您的响应状态码 404 是否然后设置重定向的默认路径 context.Request.Path = "/home/notfound";
。您还可以为其他状态代码设置默认视图,例如 500 等。
希望对您有所帮助,如果需要更多信息,请告诉我。 :)
我找到了 2 种处理 404 错误的方法。事实上,使用这些解决方案您可以处理任何 HTTP 状态代码错误。为了处理错误,两种解决方案都使用 Startup.cs class 的 configure() 方法。对于那些不了解 Startup.cs 的人,它是应用程序本身的入口点。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseApplicationInsightsRequestTelemetry();
app.Use(async (context, next) =>
{
await next();
if (context.Response.StatusCode == 404)
{
context.Request.Path = "/Home";
await next();
}
});
app.UseIISPlatformHandler(options => options.AuthenticationDescriptions.Clear());
app.UseApplicationInsightsExceptionTelemetry();
app.UseStaticFiles();
app.UseIdentity();
// To configure external authentication please see http://go.microsoft.com/fwlink/?LinkID=532715
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
解决方案 2
另一个解决方案是使用内置的中间件 StatusCodePagesMiddleware。此中间件可用于处理介于 400 和 600 之间的响应状态代码。此中间件允许 return 通用错误响应,或者还允许您重定向到任何控制器操作或另一个中间件。请参阅下面此中间件的所有不同变体。
app.UseStatusCodePages();
现在要处理 404 错误,我们将使用 app.UseStatusCodePagesWithReExecute,它接受您希望重定向的路径。
app.UseStatusCodePagesWithReExecute("/Home/Errors/{0}");
public IActionResult Errors(string errCode)
{
if (errCode == "500" | errCode == "404")
{
return View($"~/Views/Home/Error/{errCode}.cshtml");
}
return View("~/Views/Shared/Error.cshtml");
}
我有一个采用 .NET Core 1.1 和 MVC 架构的项目, 我想在不正确的 URL(状态代码:404;未找到)中重定向到我已经创建的错误视图。
在另一个只有一个控制器的项目中,我让它正常工作:
[Route ("/Home/Error")]
public IActionResult Error()
{
ViewBag.Title = "About Us";
return View();
}
[Route("/{a}/{*abc}")]
[HttpGet]
public IActionResult Err(string a)
{
return RedirectToAction("Error", "Home");
}
并且正在启动:
app.UseMvc(routes =>
{ routes.MapRoute(
name: "Default",
template: "{controller=Home}/{action=GetDocument}/{id?}");
});
但是如果在这个项目中,有 4 个控制器,在启动时使用这个配置:
app.UseMvc(routes =>
{ routes.MapRoute(
name: "Default",
template: "{controller}/{action}/{id?}",
defaults: new { controller = "Home", action = "IndexB" }
);
);
HomeController 或所有控制器上的这段代码(我都试过了):
[Route("/Home/Error")]
public IActionResult Error()
{
ViewBag.Title = "About Us";
return View();
}
[Route("/{a}/{*abc}")]
[HttpGet]
public IActionResult Err(string a)
{
return RedirectToAction("Error", "Home");
}
另一个项目中的第一个代码就像一个魅力,它会去它必须去的地方,但是如果不存在 URL 会转到错误页面。
但是在带有第二个代码的这个项目中,无论如何我总是被重定向到错误页面。
如果您重定向到 404 的默认视图,请在 Startup.cs
文件的 Configure
方法中添加自定义中间件委托。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.Use(async (context, next) =>
{
await next();
if (context.Response.StatusCode == 404)
{
context.Request.Path = "/home/notfound";
await next();
}
});
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
这里 app.Use(async (context, next) => ...
是您的 中间件委托 ,它检查您的响应状态码 404 是否然后设置重定向的默认路径 context.Request.Path = "/home/notfound";
。您还可以为其他状态代码设置默认视图,例如 500 等。
希望对您有所帮助,如果需要更多信息,请告诉我。 :)
我找到了 2 种处理 404 错误的方法。事实上,使用这些解决方案您可以处理任何 HTTP 状态代码错误。为了处理错误,两种解决方案都使用 Startup.cs class 的 configure() 方法。对于那些不了解 Startup.cs 的人,它是应用程序本身的入口点。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseApplicationInsightsRequestTelemetry();
app.Use(async (context, next) =>
{
await next();
if (context.Response.StatusCode == 404)
{
context.Request.Path = "/Home";
await next();
}
});
app.UseIISPlatformHandler(options => options.AuthenticationDescriptions.Clear());
app.UseApplicationInsightsExceptionTelemetry();
app.UseStaticFiles();
app.UseIdentity();
// To configure external authentication please see http://go.microsoft.com/fwlink/?LinkID=532715
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
解决方案 2
另一个解决方案是使用内置的中间件 StatusCodePagesMiddleware。此中间件可用于处理介于 400 和 600 之间的响应状态代码。此中间件允许 return 通用错误响应,或者还允许您重定向到任何控制器操作或另一个中间件。请参阅下面此中间件的所有不同变体。
app.UseStatusCodePages();
现在要处理 404 错误,我们将使用 app.UseStatusCodePagesWithReExecute,它接受您希望重定向的路径。
app.UseStatusCodePagesWithReExecute("/Home/Errors/{0}");
public IActionResult Errors(string errCode)
{
if (errCode == "500" | errCode == "404")
{
return View($"~/Views/Home/Error/{errCode}.cshtml");
}
return View("~/Views/Shared/Error.cshtml");
}