第一章 项目结构
Posted 飞羽在天上
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第一章 项目结构相关的知识,希望对你有一定的参考价值。
[TOC]
# 结构图
![](a60b6f39-9b59-48fe-a0ac-f2ba9840cd46_files/02192b21-2b4c-4a40-84fd-dbe8afea3e4e.png)
# 项目结构说明
| 目录/文件 | 说明 |
| ------------ | ------------ |
| 依赖项 | ASP.NET Core开发、构建和运行过程中的依赖项,一般都是NuGet包和一些SDK |
| Properties | 配置,存放一些json文件,用于配置ASP.NET Core项目 |
| Properties/launchSettings.json | 启动配置文件,主要包括环境变量,开发端口 |
| wwwroot | 网站根目录,主要存放类似于CSS、JS、图片以及html文件等静态资源文件 |
| Program.cs | 这个文件包含了应用的入口方法Main方法,负责配置和启动应用程序 |
| Startup.cs | Startup.cs是项目的入口启动文件,主要用来注册服务和配置请求管道 |
# launchSettings.json
这是一个项目启动文件,可以通过它来实现开发、测试、正式环境的自由切换,我们可以直接修改json文件,也可以通过VS提供的界面(右键当前项目->属性->调试)进行新增修改。环境变量ASPNETCORE_ENVIRONMENT可以用来控制使用哪个配置文件。
```json
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:18623/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express Test": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Test"
}
},
"NetCoreDemo.Web": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:18624/"
}
}
}
```
![](a60b6f39-9b59-48fe-a0ac-f2ba9840cd46_files/8c6161d3-46f9-4ca4-9222-8cd9509fdff5.png)
# wwwroot
wwwroot是网站的默认根目录, 它包含了所有的"前端"的静态文件, css、image、JS以及一个名为lib的文件夹.lib中默认内容是bootstrap和jquery.
在Startup中, 会调用一个无参数的UseStaticFiles()方法, 将此目录标记到网站根目录.
```csharp
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseStaticFiles();
}
```
# _Layout.cshtml
布局模板, 简单的说就是所有采用此模板的页面拥有大体一致的布局, 举个例子, 我们的页面经常是这样的结构:
![](https://images2017.cnblogs.com/blog/548134/201802/548134-20180208150014560-42688859.png)
Header、Footer和Navigation基本上是不变的, 打开_Layout.cshtml, 我们可以看到一个@RenderBody()标识, 它其实就是来定义Content部分的。
还有类似@RenderSection("Scripts", required: false)这样的标识, 引用此模板的页面可以将该页的特定JS的引用放在对应的Section中.
# _ValidationScriptsPartial.cshtml
```html
<environment include="Development">
<script src="~/lib/jquery-validation/dist/jquery.validate.js"></script>
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"></script>
</environment>
```
打开此页面, 可以看到一些这样的引用, validation 顾名思义是用来做验证的。
我们通过如下代码引用_ValidationScriptsPartial.cshtml, 也就是采用jquery-validation来做验证
```csharp
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
```
注意: 默认的_Layout模板是未引用的, 因为不是所有页面都需要有输入操作.
## Model中设置验证方式
```csharp
public class User
{
[Key]
public string Id { get; set; } = Guid.NewGuid().ToString();
[Display(Name = "姓名")]
[Required(ErrorMessage = "姓名不能为空!")]
public string Name { get; set; }
[Display(Name = "账号")]
[Required(ErrorMessage = "账号不能为空!")]
public string Account { get; set; }
[Display(Name = "密码")]
[Required(ErrorMessage = "密码不能为空!")]
public string Password { get; set; }
}
```
## 在页面添加验证
```html
<div class="form-group">
<label asp-for="Name" class="col-md-2 control-label"></label>
<div class="col-md-10">
<input asp-for="Name" class="form-control" />
<span asp-validation-for="Name" class="text-danger"></span>
</div>
</div>
```
# _ViewImports.cshtml
有点像Framework版本的MVC项目中的View目录下的那个Web.config
![](https://images2017.cnblogs.com/blog/548134/201802/548134-20180208170048623-2111482412.png)
在View中引用Model等的时候, 为了避免重复写using,可以在这个文件中添加引用
```csharp
@using NetCoreDemo.Web
@using NetCoreDemo.Web.Models
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
```
# _ViewStart.cshtml
这个打开就一句话,当然还可以在这写一些其他需要"通用"执行的内容.
```csharp
@{
Layout = "_Layout";
}
```
这个页面中的内容会在所有View执行前执行, 现在这句话就是给所有的View一个默认的Layout模板.
所以在View中这样写
```csharp
@{
Layout = null;
}
```
和这样写
```csharp
@{
}
```
是不一样的, 第一种是告诉这个View不采用任何模板.
第二种写法是什么都不干, 所以它会采用_ViewStart.cshtml中指定的模板.
# Program.cs
这是应用的起点, 启动后通过UseStartup<Startup>()指定下文的Startup启动文件进行启动.其中CreateWebHostBuilder方法构建了Kestrel服务器,负责监听,转发请求与响应客户端。.net core程序本质上是一个控制台应用程序,就算发布到IIS上,也只是用IIS做反向代理
```csharp
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
```
# Startup.cs
```csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
namespace HelloWorld
{
public class Startup
{
// 该方法在运行时被调用。
// 可以使用该方法将服务添加到容器中
public void ConfigureServices(IServiceCollection services)
{
}
// 该方法在运行时被调用
// 可以使用该方法来配置 HTTP 请求管道
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
}
}
}
```
## ConfigureServices 方法
ConfigureServices 方法用于定义应用程序所需要的服务,例如 ASP.NET Core MVC 、Entity Framework Core 和 Identity 等等
```csharp
public void ConfigureServices(IServiceCollection services){}
```
## Configure 方法
Configure定义请求管道中的中间件
```csharp
public void Configure(IApplicationBuilder app, IHostingEnvironment env){
}
```
# 引用
[[1]ASP.NET Core项目目录结构介绍][ASP.NET Core项目目录结构介绍]
[ASP.NET Core项目目录结构介绍]: https://baijiahao.baidu.com/s?id=1620334909551970021&wfr=spider&for=pc "ASP.NET Core项目目录结构介绍"
# 结构图
![](a60b6f39-9b59-48fe-a0ac-f2ba9840cd46_files/02192b21-2b4c-4a40-84fd-dbe8afea3e4e.png)
# 项目结构说明
| 目录/文件 | 说明 |
| ------------ | ------------ |
| 依赖项 | ASP.NET Core开发、构建和运行过程中的依赖项,一般都是NuGet包和一些SDK |
| Properties | 配置,存放一些json文件,用于配置ASP.NET Core项目 |
| Properties/launchSettings.json | 启动配置文件,主要包括环境变量,开发端口 |
| wwwroot | 网站根目录,主要存放类似于CSS、JS、图片以及html文件等静态资源文件 |
| Program.cs | 这个文件包含了应用的入口方法Main方法,负责配置和启动应用程序 |
| Startup.cs | Startup.cs是项目的入口启动文件,主要用来注册服务和配置请求管道 |
# launchSettings.json
这是一个项目启动文件,可以通过它来实现开发、测试、正式环境的自由切换,我们可以直接修改json文件,也可以通过VS提供的界面(右键当前项目->属性->调试)进行新增修改。环境变量ASPNETCORE_ENVIRONMENT可以用来控制使用哪个配置文件。
```json
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:18623/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express Test": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Test"
}
},
"NetCoreDemo.Web": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:18624/"
}
}
}
```
![](a60b6f39-9b59-48fe-a0ac-f2ba9840cd46_files/8c6161d3-46f9-4ca4-9222-8cd9509fdff5.png)
# wwwroot
wwwroot是网站的默认根目录, 它包含了所有的"前端"的静态文件, css、image、JS以及一个名为lib的文件夹.lib中默认内容是bootstrap和jquery.
在Startup中, 会调用一个无参数的UseStaticFiles()方法, 将此目录标记到网站根目录.
```csharp
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseStaticFiles();
}
```
# _Layout.cshtml
布局模板, 简单的说就是所有采用此模板的页面拥有大体一致的布局, 举个例子, 我们的页面经常是这样的结构:
![](https://images2017.cnblogs.com/blog/548134/201802/548134-20180208150014560-42688859.png)
Header、Footer和Navigation基本上是不变的, 打开_Layout.cshtml, 我们可以看到一个@RenderBody()标识, 它其实就是来定义Content部分的。
还有类似@RenderSection("Scripts", required: false)这样的标识, 引用此模板的页面可以将该页的特定JS的引用放在对应的Section中.
# _ValidationScriptsPartial.cshtml
```html
<environment include="Development">
<script src="~/lib/jquery-validation/dist/jquery.validate.js"></script>
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"></script>
</environment>
```
打开此页面, 可以看到一些这样的引用, validation 顾名思义是用来做验证的。
我们通过如下代码引用_ValidationScriptsPartial.cshtml, 也就是采用jquery-validation来做验证
```csharp
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
```
注意: 默认的_Layout模板是未引用的, 因为不是所有页面都需要有输入操作.
## Model中设置验证方式
```csharp
public class User
{
[Key]
public string Id { get; set; } = Guid.NewGuid().ToString();
[Display(Name = "姓名")]
[Required(ErrorMessage = "姓名不能为空!")]
public string Name { get; set; }
[Display(Name = "账号")]
[Required(ErrorMessage = "账号不能为空!")]
public string Account { get; set; }
[Display(Name = "密码")]
[Required(ErrorMessage = "密码不能为空!")]
public string Password { get; set; }
}
```
## 在页面添加验证
```html
<div class="form-group">
<label asp-for="Name" class="col-md-2 control-label"></label>
<div class="col-md-10">
<input asp-for="Name" class="form-control" />
<span asp-validation-for="Name" class="text-danger"></span>
</div>
</div>
```
# _ViewImports.cshtml
有点像Framework版本的MVC项目中的View目录下的那个Web.config
![](https://images2017.cnblogs.com/blog/548134/201802/548134-20180208170048623-2111482412.png)
在View中引用Model等的时候, 为了避免重复写using,可以在这个文件中添加引用
```csharp
@using NetCoreDemo.Web
@using NetCoreDemo.Web.Models
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
```
# _ViewStart.cshtml
这个打开就一句话,当然还可以在这写一些其他需要"通用"执行的内容.
```csharp
@{
Layout = "_Layout";
}
```
这个页面中的内容会在所有View执行前执行, 现在这句话就是给所有的View一个默认的Layout模板.
所以在View中这样写
```csharp
@{
Layout = null;
}
```
和这样写
```csharp
@{
}
```
是不一样的, 第一种是告诉这个View不采用任何模板.
第二种写法是什么都不干, 所以它会采用_ViewStart.cshtml中指定的模板.
# Program.cs
这是应用的起点, 启动后通过UseStartup<Startup>()指定下文的Startup启动文件进行启动.其中CreateWebHostBuilder方法构建了Kestrel服务器,负责监听,转发请求与响应客户端。.net core程序本质上是一个控制台应用程序,就算发布到IIS上,也只是用IIS做反向代理
```csharp
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
```
# Startup.cs
```csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
namespace HelloWorld
{
public class Startup
{
// 该方法在运行时被调用。
// 可以使用该方法将服务添加到容器中
public void ConfigureServices(IServiceCollection services)
{
}
// 该方法在运行时被调用
// 可以使用该方法来配置 HTTP 请求管道
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
}
}
}
```
## ConfigureServices 方法
ConfigureServices 方法用于定义应用程序所需要的服务,例如 ASP.NET Core MVC 、Entity Framework Core 和 Identity 等等
```csharp
public void ConfigureServices(IServiceCollection services){}
```
## Configure 方法
Configure定义请求管道中的中间件
```csharp
public void Configure(IApplicationBuilder app, IHostingEnvironment env){
}
```
# 引用
[[1]ASP.NET Core项目目录结构介绍][ASP.NET Core项目目录结构介绍]
[ASP.NET Core项目目录结构介绍]: https://baijiahao.baidu.com/s?id=1620334909551970021&wfr=spider&for=pc "ASP.NET Core项目目录结构介绍"
以上是关于第一章 项目结构的主要内容,如果未能解决你的问题,请参考以下文章