目前使用重定向的 MVC Action 代码是这么实现的:
public IActionResult SignUp() { var userAgent = Request.Headers["User-Agent"].FirstOrDefault(); if(!string.IsNullOrEmpty(userAgent) && Regex.IsMatch(userAgent, @"MSIE [1-9]\.")) { return Redirect("/iealert"); } //... }
"/iealert"是用 Razor Page (ASP.NET Core 2.0的新特性)实现的 。
使用 Redirect 最让人不舒服的地方是会改变 url 。
在曾经的 ASP.NET WebForms 中可以使用 Server.Transfer 实现:
Context.Server.Transfer("~/iealert.aspx");
在现今的 ASP.NET Core 2.0 中该如何实现呢?
终于搞定了!实现代码如下:
public async Task<IActionResult> SignUp() { var userAgent = Request.Headers["User-Agent"].FirstOrDefault(); if (!string.IsNullOrEmpty(userAgent) && Regex.IsMatch(userAgent, @"MSIE [1-9]\.")) { var executor = HttpContext.RequestServices.GetRequiredService<ViewResultExecutor>(); var view = _viewEngine.GetView(null, "~/Pages/IeAlert.cshtml", true)?.View; if (view != null) { using (view as IDisposable) { await executor.ExecuteAsync(ControllerContext, view, ViewData, TempData, "text/html; charset=utf-8", 200); } return new EmptyResult(); } } }
_viewEngine 是通过构造函数依赖注入 IRazorViewEngine
不用构造函数依赖注入 IRazorViewEngine 的实现版本
public async Task<IActionResult> SignUp() { var userAgent = Request.Headers["User-Agent"].FirstOrDefault(); if (!string.IsNullOrEmpty(userAgent) && Regex.IsMatch(userAgent, @"MSIE [1-9]\.")) { var services = HttpContext.RequestServices; var executor = services.GetRequiredService<ViewResultExecutor>(); var viewEngine = services.GetRequiredService<IRazorViewEngine>(); var view = viewEngine.GetView(null, "~/Pages/IeAlert.cshtml", true)?.View; if (view != null) { using (view as IDisposable) { await executor.ExecuteAsync(ControllerContext, view, ViewData, TempData, "text/html; charset=utf-8", 200); } return new EmptyResult(); } } //... }
@dudu: 太棒了,不过也真够折腾的。
可以直接 return View("view name")
额,抱歉,你这个是Razor Page。。如果iealert中没有特别的渲染,可以考虑用return Content("读取iealert的内容")这种做法。