Я нашел пару вещей, которые стоит упомянуть.Как и в принятом ответе, указывалось, что в NopCommernce произошли некоторые важные изменения в V4.0, в частности, в .Net Core, это довольно много меняет, особенно в отношении CustomViewEngines, который был предпочтительным методом для переопределения представлений.
Теперьчто все работает на .Net Core, есть другой метод, IViewLocationExpander .
Например, чтобы перезаписать _AdminLayout.cshtml, который отображается первым, необходим класс ViewLocationExpander:
ViewLocationExpander
public class ViewLocationExpander : IViewLocationExpander
{
public void PopulateValues(ViewLocationExpanderContext context)
{
}
public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations)
{
// Since we are wanting to override the Admin template just look for Admin in the Context, you can also get the controller and view names here.
if (context.AreaName == AreaNames.Admin)
{
//Add the location we want to use instead
viewLocations = new string[] { $"/Plugins/YourPlugin/Views/Admin/{{1}}/{{0}}.cshtml",
$"/Plugins/YourPlugin/Views/Admin/Shared/{{0}}.cshtml"}.Concat(viewLocations);
}
return viewLocations;
}
}
Затем необходим файл запуска, чтобы сообщить NopCommerence об использовании этого нового ViewLocationExpander.Механизм NopCommerence находит все классы, реализующие INopStartup, и запускает их при запуске.
YourPluginStartup.cs
public class StoreManagerStartup : INopStartup
{
public void ConfigureServices(IServiceCollection services, IConfigurationRoot configuration)
{
services.Configure<RazorViewEngineOptions>(options =>
{
options.ViewLocationExpanders.Add(new ViewLocationExpander());
});
}
public void Configure(IApplicationBuilder application)
{
}
public int Order {
get { return 0; } //Return 0 to force this to execute first, otherwise set higher i.e. 1001
}
}
Одна вещь, которую я обнаружил, когда делал это как плагин, я должен был добавить несколько ссылок нашаблон _AdminLayout.cshtml вместе с соответствующими проектами.
_AdminLayout.cshtml (только заголовок, код опущен)
@inject IWebHelper webHelper
@inject IWorkContext workContext
@inject IDateTimeHelper dateTimeHelper
@inject IPermissionService permissionService
@inject IEventPublisher eventPublisher
@inject IHttpContextAccessor httpContextAccessor
@inject CommonSettings commonSettings
@inject LocalizationSettings localizationSettings
@inject StoreInformationSettings storeInformationSettings
@using System.Globalization;
@using System.Text.Encodings.Web;
@using Microsoft.AspNetCore.Http;
@using Nop.Core.Domain.Customers;
@using Nop.Web.Framework;
@using Nop.Web.Framework.Events;
@using Nop.Web.Framework.UI;
@using Nop.Core;
@using Nop.Core.Domain;
@using Nop.Core.Domain.Common;
@using Nop.Core.Domain.Localization;
@using Nop.Services.Common;
@using Nop.Services.Customers;
@using Nop.Services.Events;
@using Nop.Services.Helpers;
@using Nop.Services.Security;
Если вы хотите добавить только в меню администратора, просто наследуйте отинтерфейс IAdminMenuPlugin выглядит следующим образом:
public class YourPlugin : BasePlugin, IAdminMenuPlugin
{
private readonly ISettingService _settingService;
private readonly IWebHelper _webHelper;
/**
* Constructor
**/
public YourPlugin(ISettingService settingService, IWebHelper webHelper)
{
this._settingService = settingService;
this._webHelper = webHelper;
}
/**
* Adds the Admin Menu Item
**/
public void ManageSiteMap(SiteMapNode rootNode)
{
var menuItem = new SiteMapNode()
{
SystemName = "Plugins.YourPlugin",
Title = "Your Plugin Title",
ControllerName = "YourPlugin",
ActionName = "Configure",
Visible = true,
RouteValues = new RouteValueDictionary() { { "area", null } },
};
// To add to the root Admin menu use
rootNode.ChildNodes.Insert(1, menuItem); // or rootNode.ChildNodes.Add(menuItem);
/* uncomment to add to the "Plugins" Menu Item
var pluginNode = rootNode.ChildNodes.FirstOrDefault(x => x.SystemName == "Third party plugins");
if (pluginNode != null)
pluginNode.ChildNodes.Add(menuItem);
else
rootNode.ChildNodes.Add(menuItem);
*/
}
}
Не забудьте добавить любые файлы _ViewStart.cshtml, если вы переопределяете страницы индекса, иначе шаблоны не будут загружены.