ASP.NET网站设计
Model→View数据传递
方式 |
数据从Controller传递到View的方法 l 使用ViewData; l 使用ViewBag; l 使用强类型模型对象,也称为强类型视图;
|
视图发现
|
HomeController对应Home文件夹、StudentController对应Student文件夹; 所有HomeController的视图都位于Views文件夹中的Home文件夹内; 所有StudentController的视图都位于Views文件夹中的Student文件夹内; Controller中的每一个操作方法对应一个cshtml视图文件; Details()方法对应Details.cshtml文件,Edit()方法对应Edit.cshtml视图文件;
|
举例 |
HomeController类; Details()方法会调用View()方法,返回一个视图; View()方法是由基类Controller提供的; Details()操作方法会返回一个视图,因此默认情况下,MVC会查找具有相同名称且扩展名为.cshtml的视图文件; 按照指定顺序在以下两个位置查找:/Views/Home/文件夹中,/Views/Shared/文件夹; 如果找不到视图文件,则会报错;The view ‘Details’was not found; |
自定义 按名称查找 |
自定义视图发现(指定名称查找): View(string viewName)的重载版本; public ViewResult Details(){return View(“Test”);} MVC就会查找Test.cshtml而不是Details.cshtml的视图文件; 如果没有找到指定的视图名称,就会按照操作方法名去查找Details.cshtml;
|
按路径查找 |
public ViewResult Details(){return View(“MyViews/Test.cshtml”);} public ViewResult Details(){return View(“/MyViews/Test.cshtml”);}✔推荐 public ViewResult Details(){return View(“~/MyViews/Test.cshtml”);}✔推荐 使用绝对路径,必须加上视图的扩展名.cshtml; 使用绝对路径,MVC会从项目的根目录开始搜索; public ViewResult Details(){return View(“../../MyViews/Test.cshtml”);} View(object model)将模型数据从控制器传递到视图; View(string viewName,object model)指定视图名称,和要传递的模型数据; |
ViewData✖ |
ViewData是弱类型的字典对象; 使用string类型的键值来存储和查询ViewData字典中的数据; 可以从ViewData直接访问数据,而无需转换为string类型; 如果访问的是其他类型数据,则要显式转换为需要的类型; ViewData在运行时进行动态解析,而不会提供编译时的检查,因此没有智能提示; 这会导致代码编写速度降低,容易出现拼写错误; 并且只能在运行时知道这些错误; 因此,不常使用ViewData; 当使用ViewData的时候,要创建一个弱类型的视图; |
ViewBag✖ |
ViewBag是ViewData的包装器; ViewData通过string类型的键值来存储查询数据; ViewBag,使用动态属性而不是字符串键值; 要将ViewBag的数据从HomeController的Details()操作方法传递到View; 在View中,同样使用动态属性访问数据成员; |
对比 |
ViewData和ViewBag的对比: 二者都可以将Controller数据传递到View; 二者都是弱类型的视图; 二者都是在运行时动态解析; 二者不提供编译时类型检查,不能的到智能提示; ViewBag是ViewData的包装器; ViewData使用字符串键值,ViewBag使用动态属性;
|
强类型视图✔ |
@model MockSchoolManagement.Models.Student @Model.Name @ViewBag.PageTitle @Model.Email @Model.Major 优点: 提供编译时的类型检查和智能提示; 减小错误几率,提高工作效率; 因此,建议始终使用强类型视图,将数据从控制器传递到视图; |
ViewModel |
Model对象可能无法包含所有数据; 无法包含的数据要通过ViewData或者ViewBag传递,又变成了弱类型视图,又容易出错了; 创建一个ViewModel对象,将所有数据包含进去; 通常创建一个文件夹ViewModels,专门存放所有ViewModel; |
布局视图 |
Header头部、Footer页脚、Menu导航菜单、View具体内容的视图; 如果没有布局视图,那么将在每个视图中重复显示很多内容; 使用布局视图,会让所有视图布局一致,并且便于修改; 布局视图也是一个后缀为.cshtml的文件,默认文件名_Layout.cshtml; 这种下划线开头的视图文件,不是直接面向浏览器的,因此用户无法直接访问他们; 布局视图相当于WebForm中的母版页; 布局视图不属于特定控制器,因此放在Views/Shared/文件夹中; 一个ASP程序可以包含多个布局视图; |
_ViewStart.cshtml |
_ViewStart.cshtml可以放置多份; 支持分层功能,文件夹中的视图优先使用本文件夹中的_ViewStart.cshtml文件,本文件夹没有,再逐层向上调用; 或者本文件夹中的_ViewStart.cshtml会覆盖掉上级文件夹中的_ViewStart.cshtml; 这样,可以为不同文件夹中的视图指定不同的布局了;✔ 子文件中的_ViewStart.cshtml将覆盖Views文件夹中的_ViewStart.cshtml; |
_ViewImports.cshtml |
用于包含公共命名空间,因此不必在每个视图中引用这些命名空间; @using指令用于包含公共命名空间; _ViewImports.cshtml还支持以下指令: @addTagHelper @removeTagHelper @tagHelperPrefix @model @inherits @inject _ViewImports.cshtml也支持分层功能,除了可以放在Views文件夹中,在其他子文件夹中放置不同的_ViewImports.cshtml; 子文件中的_ViewImports.cshtml将覆盖Views文件夹中的_ViewImports.cshtml; |
路由 |
MVC中的两种路由技术:常规路由、属性路由; 路由的定义:浏览器发出请求到达ASP程序,控制器处理传入的请求,将请求URL映射到控制器的操作方法上。这个映射过程就叫路由; http:://localhost:13380/Home/Details/1 Home将映射到HomeController控制器,Details将映射到Details()操作方法,1将自动映射到id;也就是调用HomeController类中的Details(int id)方法;
app.UseMvcWithDefaultRoute(); 默认路由模板规则:{controller=Home}/{action=Index}/{id?} http:://localhost:3290/Student/Details/1 第一个路径段/Student,是在URL中的控制器名称,没有Controller。而MVC会自动添加Controller,然后再按照完整的关键字StudentController进行查找; 第二个路径段/Details,映射到StudentController的Details(int id)方法; 第三个路径段/1,映射到操作方法的参数id; 这个步骤被称为模型绑定; 路由模板中id后面的问号?,表示该参数是可选参数; controller=Home表示controller默认值是Home; action=Index表示action默认值是Index;
|
依赖注入
容器服务 |
AddSingleton单例模式,程序只创建依次Singleton服务; AddTransient暂时模式,每次请求都会创建一个新的Transient实例; AddScoped范围模式,在范围内,每次请求创建一个新的实例; |
优点 |
降低耦合;让代码易于测试;面向对象机制; |
中间件
定义 |
中间件是一个可以处理HTTP请求或响应的软件管道; |
举例 |
Startup.cs中Configure方法的中间件: app.UseDeveloperExceptionPage(); app.UseStaticFiles(); app.UseMiddleware(); app.UseCors(); app.UseSwagger(); app.UseSwaggerUI(); app.UseRouting(); app.UseEndpoints(); |
原理 |
中间件可以同时处理传入请求和传出响应; 中间件处理传入请求,然后将该请求传递给下一个中间件,以进行下一步处理; 终端中间件terminal middleware传递的最后一个中间件; 中间件可以对传入的HTTP请求进行响应;中间件可以处理传出响应; 中间件按照添加到管道中的顺序执行; 大型团队中,中间件应该以NuGet包的形式提供; Run方法注册的中间件是终端中间件,无法调用下一个中间件; |
总结 |
ASP中间件,可以被 同时访问和请求;既可以被访问,也可以被请求; 可以处理请求,并传递给下一个; 可以处理请求,并完成传递; 可以处理传出响应; 按照添加顺序执行; |
工作流程 |
所有请求都在中间件调用next方法之前除法; 请求按照顺序依次穿越管道; 当中间件处理请求并产生响应时,请求处理流程在管道中反向传播; 所有响应都在调用next之后触发,响应依次穿过所有管道; |
基础
入口 Program.cs |
ASP项目的入口 public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } |
开始 Startup.cs |
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) |
环境变量 Properties/launchSettings.json |
"windowsAuthentication": false,启用windows身份验证 "anonymousAuthentication": true,启用匿名身份验证 "profiles": { "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } |
appsettings.json appsettings.Development.json |
"Logging": { "LogLevel": { "Default": "Debug", "System": "Information", "Microsoft": "Information" |
用户机密 secrets.json |
保存密钥、保存数据库的地址、账号、密码; 右击项目名称→管理用户及密; C:\Users\Administrator\AppData\Roaming\Microsoft\UserSecrets\e166b10e-3884-4bef-8cbf-c60863aa72ff\secrets.json |
依赖注入 IConfiguration |
public Startup(IConfiguration configuration, IWebHostEnvironment env) { Configuration = configuration; GlobalContext.LogWhenStart(env); GlobalContext.HostingEnvironment = env; } 在Startup的构造函数中,注入的IConfiguration服务,采用的是依赖注入的形式; IConfiguration服务是为了,从ASP中所有配置资源读取配置信息而设计的; 如果多个配置资源中,有重名的配置项,则后面的配置将覆盖前面的值; WebHost.CreateDefaultBuilder(args)在程序启动时,会自动调用,按照特定顺序读取配置资源; 配置信息读取顺序: 1. appsettings.json; 2. appsettings.Development.json; 3. 用户机密; 4. 环境变量; 5. 命令行参数;
|
RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。
GMT(格林尼治标准时间) GMT一般指世界时。
标签:ASP,网站,中间件,视图,文件夹,Details,cshtml,NET,View From: https://www.cnblogs.com/zhangdezhang/p/17013285.html