微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

自定义 nopCommerce

如何解决自定义 nopCommerce

我们正在开发基于 nopCommerce 的应用程序。我们的登录页面需要简约,只需要一个电子邮件 ID、密码输入字段和一个登录按钮。

您能否向我指出实现上述目标的最佳做法?

我是否修改了\Presentation\nop.Web\Views\Customer\ 中的相应页面和\Presentation\nop.Web\Controllers\ 中的控制器

是否有更好的方法来执行此操作并将所有修改过的文件组织在一个地方/文件夹中,以便升级nopCommerce 的未来版本不会很困难?

要求确保对项目(视图/控制器等)所做的所有更改都在一个文件夹中,以便在我们升级到较新版本的 nopCommerce 时不会覆盖它们。

我在某处读到您可以将需要更改的内容(Login.chtml、CustomerController)复制到 Themes/DefaultClean,然后在此文件夹中进行更改。我不记得我在哪里读到的。

我觉得这样做会使维护我们的代码库变得更加容易,因为您所有的自定义代码都在一个地方/文件夹/子文件夹中

这是最佳做法吗?而且这种做事方法有什么缺点吗?

解决方法

在不更改核心代码中的任何内容的情况下修改您的 nopCommerce 项目的最佳方法是使用描述的插件功能 here(假设您使用的是最新版本 4.40)。

要更改登录页面,您需要在插件中将修改后的版本创建为 .cshtml 文件。然后,您需要将此文件设置为内​​容,并将复制到输出目录 属性设置为如果较新则复制或始终复制。

您还需要实现 IViewLocationExpander 接口,以便 Razor 引擎知道它应该使用您的自定义登录页面。实现应该是这样的:

public class MyViewLocationExpander : IViewLocationExpander
{
   public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context,IEnumerable<string> viewLocations)
   {
      if(context.ViewName == "Login")
      {
         viewLocations = new[] { "PathToCustomLoginPage" }.Concat(viewLocations);
      }

      return viewLocations;
   }

   public void PopulateValues(ViewLocationExpanderContext context)
   {
      return;
   }
}

之后,您还需要通过实现 INopStartup 接口来注册您的 ViewExpander。实现看起来像这样:

public class MyStartup : INopStartup
{
   public int Order => int.MaxValue;

   public void Configure(IApplicationBuilder application)
   {
   }

   public void ConfigureServices(IServiceCollection services,IConfiguration configuration)
   {
      services.Configure<RazorViewEngineOptions>(options =>
      {
         options.ViewLocationExpanders.Add(new MyViewLocationExpander());
      });
   }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。