3

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

我想要做的是将视图名称更改为index.amp.cshtml而不是index.cshtml当我的 URL 开始时 iwth /amp。在 .NET Core 中实现这一目标的最佳方法是什么?

4

2 回答 2

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 Services方法中Startup.cs,添加以下内容:

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

这将做的是更新每个请求的视图位置,以便.amp.cshtmlURL/ampamp. 如果您的 AMP 视图不存在,它可能会有点爆炸,我尚未对其进行全面测试,但它应该可以帮助您入门。

于 2018-03-06T10:16:40.530 回答
0

你可以定义这个Middleware

public class AmpMiddleware
{
    private RequestDelegate _next;

    public AmpMiddleware(RequestDelegate next)
    {
        _next = next;
    }
    public Task Invoke(HttpContext context)
    {
        const string ampTag = "/amp";

        var path = context.Request.Path;
        if (path.HasValue)
        {
            var ampPos = path.Value.IndexOf(ampTag);
            if (ampPos >= 0)
            {
                context.Request.Path = new PathString(path.Value.Remove(ampPos, ampTag.Length));
                context.Items.Add("amp", "true");
            }
        }
        return _next(context);
    }
}

public static class BuilderExtensions
{
    public static IApplicationBuilder UseAmpMiddleware(this IApplicationBuilder app)
    {
        return app.UseMiddleware<AmpMiddleware>();
    }
}

并调用它Startup

app.UseAmpMiddleware();

然后可以签入页面并简单地设置另一个布局或限制一些代码,这样就不需要为 amp 版本创建单独的页面:

@if (HttpContext.Items.ContainsKey("amp"))
{
    <b>Request AMP Version</b>
}
于 2020-12-17T10:35:51.997 回答