TOC
Asp .Net Core 3.x
Asp .Net Core
本质是 一个Server
+ 多个中间件(Middleware)组成的管道(Pipline)
。
本身是一个console application
,经 Main() > CreateHostBuilder(args).Build()
后成为web application
。
Asp .Net Core 应用多样性
- MVC:/Home/Index
- Razor Pages: /SomePage
- SignalR: /Hub/Chat
2. Razor Page
MVC
- Model: 数据
- View: Html, Razor, TagHelpers
- Controller: 逻辑
Razor Page
- 数据
- Html, Razor, TagHelpers
- 逻辑
Create Project
- New > Project > Asp .Net core web application
Startup.cs
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseStaticFiles();
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
Create Models, Service and Register services
-
Startup.cs
public void ConfigureServices(IServiceCollection services) { services.AddRazorPages(); services.AddSingleton<IDepartmentService, DepartmentService>(); services.AddSingleton<IEmployeeService, EmpolyeeService>(); }
Config配置信息源
-
appsettings.json
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "AllowedHosts": "*", "AspCoreRazorDemo": { "BoldDepartmentEmployeeC: 30 } }
Startup.cs 注入Config,映射为options类
private readonly IConfiguration configuration;
public Startup(IConfiguration configuration)
{
this.configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddSingleton<IDepartmentService, DepartmentService>();
services.AddSingleton<IEmployeeService, EmpolyeeService>();
services.Configure<AspCoreRazorDemoOptions>(configuration.GetSection("AspCoreRazorDemo"));
}
Using libman Install bootstrap
-
Add > Client-Side Library > bootstrap@4.4.1 > Install, libman.json
{ "version": "1.0", "defaultProvider": "unpkg", "libraries": [ { "library": "bootstrap@4.4.1", "destination": "wwwroot/lib/bootstrap/", "files": [ "dist/css/bootstrap.css" ] } ] }
Using BuildBundlerMinifier Merge and Minify css files
-
Add > New Item, bundleconfig.json
[ { "outputFileName": "wwwroot/css/all.min.css", "inputFiles": [ "wwwroot/css/site.css", "wwwroot/lib/bootstrap/dist/css/bootstrap.css" ] }, { "outputFileName": "wwwroot/css/bootstrap.css", "inputFiles": [ "wwwroot/lib/bootstrap/dist/css/bootstrap.css" ], "minify": {"enabled": true} } ]
-
Manage NuGet packges > BuildBundlerMinifier
ASPNETCORE_ENVIRONMENT
-
\Properties\launchSettings.json
{ "profiles": { "AspCoreRazorDemo": { "commandName": "Project", "launchBrowser": true, "applicationUrl": "https://localhost:5001;http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } } } }
Views
-
Views > _ViewImports.cshtml 全局启用TagHelper : Add > New Item > Razor View Imports
@using AspCoreRazorDemo @namespace AspCoreRazorDemo.Pages @addTagHelper "*, Microsoft.AspNetCore.Mvc.TagHelpers"
-
Views > Shared > _Layout.cshtml 公共页面 : Add > New Item > Razor Layout
<!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>@ViewBag.Title</title> <environment include="Development"> <link rel="stylesheet" asp-href-include="css/*" asp-href-exclude="css/all.main.css" /> </environment> <environment exclude="Development"> <link rel="stylesheet" asp-href-include="css/all.main.css" /> </environment> </head> <body> <div class="container"> <div class="row"> <div class="col-md-2"> <!-- taghelper: asp-append-version 防止图片被缓存 --> <img asp-append-version="true" alt="logo" src="~/images/Home.png" style="height: 60px; width: 100px;" /> </div> <div class="col-md-10"> <span class="h2">@ViewBag.Title</span> </div> </div> <div class="row"> <div class="col-md-12"> @RenderBody() </div> </div> </div> </body> </html>
-
Views > _ViewStart.cshtml start 页面: Add > New Item > Razor View Start
@{ Layout = "_Layout"; }
-
Pages > Index.cshtml : Add > NewItem > Razor View
@page @using AspCoreRazorDemo.Models @using AspCoreRazorDemo.Services @inject IDepartmentService departmentService <div class="row"> <div class="col-md-10 offset-md-2"> <table class="table"> <tr> <th>Name</th> <th>Location</th> <th>EmployeeCount</th> <th>Opration</th> </tr> @Html.DisplayFor(x => x.Departments) </table> </div> </div> <div class="row"> <div class="col-md-4"> <a asp-page="Department/AddDepartment">Add</a> </div> </div> @functions { public IEnumerable<Department> Departments { get; set; } public async Task OnGetAsync() { Departments = await departmentService.GetAll(); } }
-
Pages > DisplayTemplates > Department.cshtml: Add > NewItem > Razor View
@using AspCoreRazorDemo.Models @using Microsoft.Extensions.Options @model AspCoreRazorDemo.Models.Department @inject IOptions<AspCoreRazorDemoOptions> options <tr> @if (Model.EmployeeCount > options.Value.BoldDepartmentEmployeeCount) { <td><strong>@Model.Name</strong></td> } else { <td>@Model.Name</td> } <td>@Model.Location</td> <td>@Model.EmployeeCount</td> </tr>
-
Pages > Department> AddDepartment.cshtml: Add > New Item > Razor Page
@page @model AspCoreRazorDemo.Pages.Department.AddDepartmentModel <form method="post"> <div class="row form-group"> <div class="col-md-2 offset-md-2"> <label asp-for="Department.Name"></label> </div> <div class="col-md-6"> <input class="form-control" asp-for="Department.Name" /> </div> </div> <div class="row form-group"> <div class="col-md-2 offset-md-2"> <label asp-for="Department.Location"></label> </div> <div class="col-md-6"> <input class="form-control" asp-for="Department.Location" /> </div> </div> <div class="row form-group"> <div class="col-md-2 offset-md-2"> <label asp-for="Department.EmployeeCount"></label> </div> <div class="col-md-6"> <input class="form-control" asp-for="Department.EmployeeCount" /> </div> </div> <div class="row"> <div class="col-md-2 offset-md-2"> <button type="submit" class="btn btn-primary">Add</button> </div> </div> </form>
-
Pages > Department> AddDepartment.cshtml.cs
public class AddDepartmentModel : PageModel { private readonly IDepartmentService departmentService; [BindProperty] public AspCoreRazorDemo.Models.Department Department { get; set; } public AddDepartmentModel(IDepartmentService departmentService) { this.departmentService = departmentService; } public async Task<IActionResult> OnPostAsync() { if (ModelState.IsValid) { await departmentService.Add(Department); return RedirectToPage("/Index"); } return Page(); } }
ViewComponet 可重用组件
-
Pages> Shared> Components> CompanySummary> Default.cshtml
-
ViewComponents > CompanySummaryViewComponent.cs
-
Views\_ViewImports.cshtml 引入本项目程序集
@using AspCoreRazorDemo @namespace AspCoreRazorDemo.Pages @addTagHelper "*, Microsoft.AspNetCore.Mvc.TagHelpers" @addTagHelper "*, AspCoreRazorDemo"
-
Pages\Index.cshtml 使用ViewComponent
<div class="row"> <div class="col-md-2"> @await Component.InvokeAsync("CompanySummary", new { title = "Summary of Company" }) <vc:company-summary title="Summary"></vc:company-summary> </div> <div class="col-md-4"> <a asp-page="Department/AddDepartment">Add</a> </div> </div>
项目地址
github: https://github.com/leezhuang96/Asp.NetCoreDemo
「下次一定」
下次一定
使用微信扫描二维码完成支付