我们正在开发一个基于 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());
});
}
}