JXMovies/Core/JXCMS.Core/Themes/TemplateViewLocationExpander.cs
2020-02-09 19:10:05 +08:00

77 lines
2.8 KiB
C#
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections.Generic;
using System.Linq;
using DeviceDetectorNET.Parser.Device;
using JXCMS.Core.Extensions;
using Microsoft.AspNetCore.Mvc.Razor;
namespace JXCMS.Core.Themes
{
public class TemplateViewLocationExpander : IViewLocationExpander
{
/// <summary>
/// PC主题不切换主题与自适应主题同样使用此主题
/// </summary>
public static string PcThemeName = "Default";
/// <summary>
/// 手机版主题
/// </summary>
public static string MobileThemeName = "Mobile";
/// <summary>
/// 主题切换方式,默认为不切换
/// </summary>
public static ThemeChangeMode Mode { get; set; } = ThemeChangeMode.None;
/// <summary>
/// 手机版域名
/// </summary>
public static string MobileDomain;
public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations)
{
if (!context.AreaName.IsNullOrEmpty())
{
return viewLocations;
}
var themeName = context.Values["template"] ?? PcThemeName;
string[] locations = { "/Views/" + themeName + "/{1}/{0}.cshtml", "/Views/" + themeName + "/{0}.cshtml", "/Views/" + themeName + "/Shared/{0}.cshtml", "/Views/Shared/{0}.cshtml" };
return locations.Union(viewLocations.Where(x => !x.StartsWith("/Views/")));
}
public void PopulateValues(ViewLocationExpanderContext context)
{
switch (Mode)
{
case ThemeChangeMode.None:
case ThemeChangeMode.Adaptive:
context.Values["template"] = PcThemeName;
break;
case ThemeChangeMode.Auto:
MobileParser mobileParser = new MobileParser();
mobileParser.SetUserAgent(context.ActionContext.HttpContext.Request.Headers["User-Agent"]);
var result = mobileParser.Parse();
if ( result.Success)
{
context.Values["template"] = MobileThemeName;
}
else
{
context.Values["template"] = PcThemeName;
}
break;
case ThemeChangeMode.Domain:
if (context.ActionContext.HttpContext.Request.Host.Host == MobileDomain)
{
context.Values["template"] = MobileThemeName;
}
else
{
context.Values["template"] = PcThemeName;
}
break;
}
}
}
}