diff --git a/templates/module/aspnet-core/MyCompanyName.MyProjectName.sln b/templates/module/aspnet-core/MyCompanyName.MyProjectName.sln
index ea7d59fe2c..f8a737dfdc 100644
--- a/templates/module/aspnet-core/MyCompanyName.MyProjectName.sln
+++ b/templates/module/aspnet-core/MyCompanyName.MyProjectName.sln
@@ -49,6 +49,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MyCompanyName.MyProjectName
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MyCompanyName.MyProjectName.Web.Unified", "host\MyCompanyName.MyProjectName.Web.Unified\MyCompanyName.MyProjectName.Web.Unified.csproj", "{3D872C41-E226-45C8-89C1-9D3DBD7C73F2}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MyCompanyName.MyProjectName.Blazor", "src\MyCompanyName.MyProjectName.Blazor\MyCompanyName.MyProjectName.Blazor.csproj", "{827FCC18-A22B-4175-82CD-1233F6DEE8FB}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -135,6 +137,10 @@ Global
{3D872C41-E226-45C8-89C1-9D3DBD7C73F2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3D872C41-E226-45C8-89C1-9D3DBD7C73F2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3D872C41-E226-45C8-89C1-9D3DBD7C73F2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {827FCC18-A22B-4175-82CD-1233F6DEE8FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {827FCC18-A22B-4175-82CD-1233F6DEE8FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {827FCC18-A22B-4175-82CD-1233F6DEE8FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {827FCC18-A22B-4175-82CD-1233F6DEE8FB}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -160,6 +166,7 @@ Global
{690203F4-3CD5-4569-88D9-EE831EEA5F5F} = {E400416D-2895-4512-9D17-90681EEC7E0A}
{F6AC8D4A-EDD7-4514-8E8A-5BCB019864DB} = {E400416D-2895-4512-9D17-90681EEC7E0A}
{3D872C41-E226-45C8-89C1-9D3DBD7C73F2} = {E400416D-2895-4512-9D17-90681EEC7E0A}
+ {827FCC18-A22B-4175-82CD-1233F6DEE8FB} = {649A3FFA-182F-4E56-9717-E6A9A2BEC545}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {4324B3B4-B60B-4E3C-91D8-59576B4E26DD}
diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Menus/MyProjectNameMenuContributor.cs b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Menus/MyProjectNameMenuContributor.cs
new file mode 100644
index 0000000000..11062a5e2a
--- /dev/null
+++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Menus/MyProjectNameMenuContributor.cs
@@ -0,0 +1,23 @@
+using System.Threading.Tasks;
+using Volo.Abp.UI.Navigation;
+
+namespace MyCompanyName.MyProjectName.Blazor.Menus
+{
+ public class MyProjectNameMenuContributor : IMenuContributor
+ {
+ public async Task ConfigureMenuAsync(MenuConfigurationContext context)
+ {
+ if (context.Menu.Name == StandardMenus.Main)
+ {
+ await ConfigureMainMenu(context);
+ }
+ }
+
+ private Task ConfigureMainMenu(MenuConfigurationContext context)
+ {
+ //Add main menu items.
+
+ return Task.CompletedTask;
+ }
+ }
+}
\ No newline at end of file
diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Menus/MyProjectNameMenus.cs b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Menus/MyProjectNameMenus.cs
new file mode 100644
index 0000000000..18d64be308
--- /dev/null
+++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Menus/MyProjectNameMenus.cs
@@ -0,0 +1,11 @@
+namespace MyCompanyName.MyProjectName.Blazor.Menus
+{
+ public class MyProjectNameMenus
+ {
+ private const string Prefix = "MyProjectName";
+
+ //Add your menu items here...
+ //public const string Home = Prefix + ".MyNewMenuItem";
+
+ }
+}
\ No newline at end of file
diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj
new file mode 100644
index 0000000000..340e386e3a
--- /dev/null
+++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj
@@ -0,0 +1,18 @@
+
+
+
+
+
+ netstandard2.1
+ 3.0
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorAutoMapperProfile.cs b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorAutoMapperProfile.cs
new file mode 100644
index 0000000000..b3cf8b84b6
--- /dev/null
+++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorAutoMapperProfile.cs
@@ -0,0 +1,14 @@
+using AutoMapper;
+
+namespace MyCompanyName.MyProjectName.Blazor
+{
+ public class MyProjectNameBlazorAutoMapperProfile : Profile
+ {
+ public MyProjectNameBlazorAutoMapperProfile()
+ {
+ /* You can configure your AutoMapper mapping configuration here.
+ * Alternatively, you can split your mapping configurations
+ * into multiple profile classes for a better organization. */
+ }
+ }
+}
\ No newline at end of file
diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs
new file mode 100644
index 0000000000..907e503e44
--- /dev/null
+++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs
@@ -0,0 +1,36 @@
+using Microsoft.Extensions.DependencyInjection;
+using MyCompanyName.MyProjectName.Blazor.Menus;
+using Volo.Abp.AspNetCore.Components.WebAssembly.Theming.Routing;
+using Volo.Abp.AutoMapper;
+using Volo.Abp.Modularity;
+using Volo.Abp.UI.Navigation;
+
+namespace MyCompanyName.MyProjectName.Blazor
+{
+ [DependsOn(
+ typeof(MyProjectNameHttpApiClientModule),
+ typeof(AbpAutoMapperModule)
+ )]
+ public class MyProjectNameBlazorModule : AbpModule
+ {
+ public override void ConfigureServices(ServiceConfigurationContext context)
+ {
+ context.Services.AddAutoMapperObjectMapper();
+
+ Configure(options =>
+ {
+ options.AddProfile(validate: true);
+ });
+
+ Configure(options =>
+ {
+ options.MenuContributors.Add(new MyProjectNameMenuContributor());
+ });
+
+ Configure(options =>
+ {
+ options.AdditionalAssemblies.Add(typeof(MyProjectNameBlazorModule).Assembly);
+ });
+ }
+ }
+}
\ No newline at end of file
diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Pages/MyProjectName/Index.razor b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Pages/MyProjectName/Index.razor
new file mode 100644
index 0000000000..d54a229594
--- /dev/null
+++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Pages/MyProjectName/Index.razor
@@ -0,0 +1,8 @@
+@page "/MyProjectName"
+@using Microsoft.Extensions.Localization
+@using MyCompanyName.MyProjectName.Localization
+@inject IStringLocalizer L
+@{
+}
+MyProjectName
+@L["SamplePageMessage"]
\ No newline at end of file
diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/_Import.razor b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/_Import.razor
new file mode 100644
index 0000000000..4685ac9893
--- /dev/null
+++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/_Import.razor
@@ -0,0 +1,5 @@
+@using Microsoft.AspNetCore.Components.Web
+@using Volo.Abp.AspNetCore.Components.WebAssembly
+@using Volo.Abp.BlazoriseUI
+@using Blazorise
+@using Blazorise.DataGrid
\ No newline at end of file