第一章 项目结构

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项目目录结构介绍"

以上是关于第一章 项目结构的主要内容,如果未能解决你的问题,请参考以下文章

第一章:Idea快速创建SpringBoot项目

《大道至简》第一章读后感及伪代码

第一章 新手入门

读《大道至简》第一章有感

第一章 Android初体验

《构建之法(第三版)》第一章