我们可以把整个项目比喻成一家餐厅的运作体系。
第一步:先看项目结构(以默认模板为例)
当你通过 Visual Studio 或 dotnet new webapp 命令创建一个新项目后,会看到类似下面的文件夹和文件(不同版本可能略有差异,但核心一致):
你的项目名称/
│
├── 📁 Properties/
│ └── launchSettings.json (配置文件:启动按钮的设置)
│
├── 📁 wwwroot/ (餐厅的"公共用餐区":存放浏览器能直接访问的静态文件)
│ ├── 📁 css/ (样式文件 – 餐厅的装修风格)
│ ├── 📁 js/ (JavaScript文件 – 服务员的现场互动)
│ └── 📁 lib/ (第三方库 – 比如借来的桌椅餐具)
│
├── 📁 Pages/ (餐厅的"核心包间区":所有网页都在这里)
│ ├── 📁 Shared/ (公共组件:每个包间都有的墙壁、菜单样式)
│ │ └── _Layout.cshtml (网页的"骨架":定义页眉、页脚、导航栏)
│ │ └── _ValidationScriptsPartial.cshtml (脚本片段:用于表单验证)
│ │
│ ├── Index.cshtml (首页:比如餐厅的入口大厅)
│ ├── Index.cshtml.cs (首页的"专属服务员":处理首页的后台逻辑)
│ ├── Privacy.cshtml (隐私政策页)
│ └── Privacy.cshtml.cs (隐私页的专属服务员)
│
├── 📁 bin/ 和 📁 obj/ (厨房后厨:编译生成的临时文件和最终输出,一般不用管)
│
├── appsettings.json (餐厅的"规章制度手册":数据库连接、应用配置)
├── appsettings.Development.json (开发环境专用的规章制度)
├── Program.cs (餐厅的"总设计师+总指挥":应用的入口和启动配置)
└── 项目名称.csproj (餐厅的"购物清单":项目依赖的包和SDK)
第二步:详细讲解每个核心文件
1. Program.cs —— 餐厅的"总设计师+总指挥"
这是整个项目最先运行的地方,相当于你进入餐厅前,设计师画好蓝图、老板搭好骨架。
// 这是创建一个默认的Web应用构建器,相当于开始搭建餐厅
var builder = WebApplication.CreateBuilder(args);
// 告诉餐厅:我们使用Razor Pages模式营业
// 这会在系统中注册所有必要的服务,比如把"页面文件(.cshtml)"和"服务员(.cshtml.cs)"关联起来
builder.Services.AddRazorPages();
// 搭建完成,餐厅开始营业
var app = builder.Build();
// 配置HTTP请求管道:相当于设定客人进门后的路线
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error"); // 如果出错了,带客人去错误处理页面
app.UseHsts(); // 强制使用HTTPS安全连接
}
app.UseHttpsRedirection(); // 把所有HTTP请求自动跳转到HTTPS(更安全)
app.UseStaticFiles(); // 允许客人访问 wwwroot 文件夹里的静态文件(图片、CSS)
app.UseRouting(); // 启动路由系统:根据客人访问的URL,决定带他去哪个包间
app.MapRazorPages(); // 关键步骤:把所有Razor Pages映射到路由中
// 比如访问 "/Index" 就去找 Index.cshtml
app.Run(); // 餐厅开始正式营业,监听客人请求
2. Pages 文件夹 —— 餐厅的"核心包间区"
这里存放所有 .cshtml 文件,每个文件代表网站的一个具体页面。
2.1 _Layout.cshtml (在Shared文件夹中) —— 网页的"骨架"
这个文件定义了所有页面的公共部分,比如:
- 整个网站的头部(Logo、导航菜单)
- 底部(版权信息)
- 全局CSS和JS引用
<!DOCTYPE html>
<html>
<head>
<!– 这里的 @RenderSection("Head", …) 是个占位符 –>
<link rel="stylesheet" href="~/css/site.css" />
</head>
<body>
<header>这里是导航栏</header>
<!– 最关键的部分:页面主体内容会渲染在这里 –>
@RenderBody()
<footer>版权所有</footer>
@await RenderSectionAsync("Scripts", required: false)
</body>
</html>
其他页面(如Index.cshtml)只负责写自己独有的内容,最终会被塞进 @RenderBody() 的位置。
2.2 Index.cshtml 和 Index.cshtml.cs —— 一对一的"包间+服务员"
这是Razor Pages的精髓,一个页面由一对文件组成。
-
Index.cshtml (视图/界面):就是你在浏览器里看到的HTML代码,可以混合C#代码。
@page // 第一行必须是@page,标记这是一个Razor Page
@model IndexModel // 关联到下面的IndexModel类<h1>欢迎</h1>
<p>当前时间是: @Model.CurrentTime</p><form method="post">
<button type="submit">点我提交</button>
</form> -
Index.cshtml.cs (页面模型/逻辑):处理页面的后台逻辑。
using Microsoft.AspNetCore.Mvc.RazorPages;
public class IndexModel : PageModel // 继承PageModel
{
public string CurrentTime { get; set; }// 当用户通过GET方式访问页面时(比如直接在浏览器输入网址),这个方法会被执行
public void OnGet()
{
CurrentTime = DateTime.Now.ToString();
}// 当用户通过POST方式提交表单时,这个方法会被执行
public void OnPost()
{
CurrentTime = "你刚刚点了提交按钮!";
}
}这里要特别注意:.cshtml.cs 文件的名字必须和 .cshtml 一样,并且放在同一个文件夹下。
3. wwwroot 文件夹 —— 餐厅的"公共用餐区"
这是唯一一个浏览器可以直接访问的文件夹。存放:
- css/site.css:整个网站的样式表(字体、颜色、布局)。
- js/site.js:你自己写的JavaScript代码(弹窗、动画)。
- lib/:第三方的库,比如jQuery、Bootstrap。
4. appsettings.json —— 餐厅的"规章制度手册"
存放配置信息,比如:
{
"Logging": { … }, // 日志记录级别(错误信息记多细)
"ConnectionStrings": {
"DefaultConnection": "数据库连接字符串" // 数据库地址和账号
},
"AllowedHosts": "*" // 允许哪些域名访问
}
5. launchSettings.json (在Properties文件夹里) —— 调试模式的"开关面板"
当你按F5启动项目时,Visual Studio 会读这个文件。它定义了:
- 用什么浏览器打开?
- 打开哪个URL?(https://localhost:5001)
- 是否自动打开窗口?
第三步:一次完整的请求流程(帮你串起来)
为了让你理解这些文件如何协同工作,我们模拟一次访问首页的过程:


