Есть несколько способов достичь чего-то подобного.Одной из возможностей может быть динамическое изменение макета в зависимости от маршрута, т. Е. В противном случае использовать шаблон X для AMP или Y.
Более мощным решением будет расширитель местоположения вида .Это также обычно считается преемником режимов отображения.Расширитель местоположения вида - это, по сути, механизм, который позволяет постобработать физические местоположения, где механизм Razor будет искать виды.Таким образом, вы можете использовать это для условного изменения или расширения путей, по которым расположены ваши представления.
В вашем случае вы можете захотеть изменить поведение так, чтобы при доступе к сайту через AMP Razor должен сначала искать<view>.amp.cshtml
прежде чем вернуться к <view>.cshtml
.
Чтобы сделать это, вам нужно будет реализовать IViewLocationExpander
.В PopulateViews
вы должны определить, находитесь ли вы в режиме AMP или нет;и в ExpandViewLocations
вы могли бы затем изменить местоположения вида.
Это может выглядеть примерно так (не проверено, как идея о том, как подойти к этому):
public class AmpViewLocationExpander : IViewLocationExpander
{
private const string ValueKey = "ampmode";
public void PopulateValues(ViewLocationExpanderContext context)
{
// magic utility method that determines whether this is within an AMP context
var isAmp = context.ActionContext.HttpContext.IsAmp();
// persist the value on the context to allow the cache to consider this
context.Values[ValueKey] = isAmp.ToString();
}
public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context,
IEnumerable<string> viewLocations)
{
// when in AMP mode
if (context.Values.TryGetValue(ValueKey, out var isAmpValue) && isAmpValue == "True")
{
return ExpandAmpViewLocations(viewLocations);
}
// otherwise fall back to default locations
return viewLocations;
}
private IEnumerable<string> ExpandAmpViewLocations(IEnumerable<string> viewLocations)
{
foreach (var location in viewLocations)
{
// yield the AMP version first
yield return location.Replace("{0}", "{0}.amp");
// then yield the normal version as a fallback
yield return location;
}
}
}
Если у вас есть это, вам нужно зарегистрировать расширитель только после вызова AddMvc
внутри вашего ConfigureServices
:
services.AddMvc()
.AddRazorOptions(options =>
{
options.ViewLocationExpanders.Add(new AmpViewLocationExpander());
});
И тогда вам нужно только создать альтернативные виды для AMP.