在ASP.NET MVC中自动切换AMP的视图

问题描述 投票:2回答:1

我想使用.NET Core 2.0在ASP.NET MVC中创建我的网站的AMP版本。以前我曾在.Net框架上使用DisplayModeProvider实例做过一些工作,但这似乎不是.NET Core中的一个选项。

我希望能够做的是当我的网址开始时index.amp.cshtml,将视图名称改为index.cshtml而不是/amp。在.NET Core中实现这一目标的最佳方法是什么?

asp.net-core-mvc google-amp
1个回答
4
投票

你可以使用IViewLocationExpander做这样的事情。碰巧,几天前我正在玩这个,所以我有一些代码样本。如果你创建这样的东西:

public class AmpViewLocationExpander : IViewLocationExpander
{
    public void PopulateValues(ViewLocationExpanderContext context)
    {
        var contains = context.ActionContext.HttpContext.Request.Query.ContainsKey("amp");
        context.Values.Add("AmpKey", contains.ToString());

        var containsStem = context.ActionContext.HttpContext.Request.Path.StartsWithSegments("/amp");
        context.Values.Add("AmpStem", containsStem.ToString());
    }

    public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations)
    {
        if (!(context.ActionContext.ActionDescriptor is ControllerActionDescriptor descriptor)) { return viewLocations; }

        if (context.ActionContext.HttpContext.Request.Query.ContainsKey("amp")
            || context.ActionContext.HttpContext.Request.Path.StartsWithSegments("/amp")
        )
        {
            return viewLocations.Select(x => x.Replace("{0}", "{0}.amp"));
        }

        return viewLocations;
    }
}

iViewLocationExpander可以在Microsoft.AspNetCore.Mvc.Razor找到

然后在Configure ServicesStartup.cs方法中,添加以下内容:

  services.Configure<RazorViewEngineOptions>(options =>
        {
            options.ViewLocationExpanders.Add(new AmpViewLocationExtender());
        });

这将做的是更新每个请求的视图位置,以便在.amp之前插入.cshtml,无论URL是以/amp开头还是有amp的查询字符串键。如果你的AMP视图不存在,它可能会爆炸一点,我还没有完全测试它,但它应该让你开始。

© www.soinside.com 2019 - 2024. All rights reserved.