首页新闻找找看学习计划

在ASP.NET Core中如何不使用重定向而直接返回Razor Page

0
悬赏园豆:30 [已解决问题] 解决于 2017-08-14 18:38

目前使用重定向的 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 中该如何实现呢?

dudu的主页 dudu | 高人七级 | 园豆:39088
提问于:2017-08-13 21:58
< >
分享
最佳答案
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();
        }
    }
}
dudu | 高人七级 |园豆:39088 | 2017-08-14 18:37

_viewEngine 是通过构造函数依赖注入 IRazorViewEngine

dudu | 园豆:39088 (高人七级) | 2017-08-14 18:41

不用构造函数依赖注入 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 | 园豆:39088 (高人七级) | 2017-08-14 18:48

@dudu: 太棒了,不过也真够折腾的。

幻天芒 | 园豆:36522 (高人七级) | 2017-08-14 22:59
其他回答(2)
0

可以直接 return View("view name")

 

额,抱歉,你这个是Razor Page。。如果iealert中没有特别的渲染,可以考虑用return Content("读取iealert的内容")这种做法。

收获园豆:20
幻天芒 | 园豆:36522 (高人七级) | 2017-08-13 23:09
0

貌似现在需要自己定义一个中间件,然后接管路由中关于某些page。

最新的Razor引擎可以比较简单的解析razor page,然后将其动态编译、缓存,再执行。

不知道MS对这种需求感不感兴趣。

收获园豆:10
c99 | 园豆:1838 (小虾三级) | 2017-08-14 12:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册