asp.net core mvc 学习与理解
1、环境变量
-
开发环境--Development
- 演示(模拟、临时)环境--Staging(测试服务器)
- 生产环境-- Production
在launchsettings.json中配置环境变量
使用IHostingEnvironment注入Startup.cs的 Configure()方法
if (env.IsDevelopment())
环境标记助手(Environment Tag Helper)
2、依赖注入
注册服务的三个生命周期
AddSingleton()——每个应用程序只创建一次Singleton服务,并且在整个应用程序生命周期中使用该单个实例。
AddTransient() 暂时性模式,会创建一个 Transient 服务。每次请求时,都会创建一个新的 Transient 服务实例。
AddScoped()在 Web 应用程序中,它为每个 http 请求创建 1 个实例,但在同一 Web 请求中的其他调用中使用相同的实例,在一个客户端请求中是相同的,但在多个客户端请求中是不同的。
3、_ViewStart.cshtml 文件

在调用单个视图中的代码之前先执行
支持分层(home 子文件夹中 ViewStart 文件中指定的布局页面,将覆盖 Views 文件夹中 ViewStart 文件中指定的布局页面。
4、_ViewImports.cshtml 文件
引入公共的命名空间
支持分层
5、Tag Helpers(标记助手)
使用内置的Taghelper,则需要使用@addTagHelper指令在_ViewImports.cshtml 文件导入 Taghelper
asp-controller指 控制器名称,而asp-action指操作方法的名称
environment Taghelper支持 环境可以引用不同的内容
<environment include="Development"> <link href="~/lib/bootstrap/css/bootstrap.css" rel="stylesheet"/></environment>
6、 全局异常处理
处理异常并将用户浏览的页面重定向到自定义错误视图
步骤 1:对于非开发环境,使用 UseExceptionHandler()方法将异常处理中间件添加到请求处理管道。我们需要打开 Startup 类的 Configure()方法。异常处理中间件会去 ErrorController,请参考以下代码:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
}
步骤 2:修改 ErrorController 代码,它检索异常详细信息并返回自定义错误视图。在生产应用程序中,我们不会在错误视图上显示异常详细信息。我们可以将它们记录到数据库表,文件,事件查看器等,以便开发人员可以查看它们并在需要时提供代码修复。我们将在稍后的章节中讨论日志记录。
public class ErrorController : Controller
{
[AllowAnonymous]
[Route("Error")]
public IActionResult Error()
{
//获取异常细节
var exceptionHandlerPathFeature =
HttpContext.Features.Get<IExceptionHandlerPathFeature>();
ViewBag.ExceptionPath = exceptionHandlerPathFeature.Path;
ViewBag.ExceptionMessage = exceptionHandlerPathFeature.Error.Message;
ViewBag.StackTrace = exceptionHandlerPathFeature.Error.StackTrace;
return View("Error");
}
}
步骤3;实现错误视图
<h3>
程序请求时发生了一个内部错误,我们会反馈给团队,我们正在努力解决这个问题。
</h3>
<h5>请通过 ltm@ddxc.org 与我们取得联系</h5>
<hr/>
<h3>错误详情:</h3>
<div class="alert alert-danger">
<h5>异常路径:</h5>
<hr/>
<p>@ViewBag.ExceptionPath</p>
</div>
<div class="alert alert-danger">
<h5>异常信息:</h5>
<hr/>
<p>@ViewBag.ExceptionMessage</p>
</div>
<div class="alert alert-danger">
<h5>异常堆栈跟踪:</h5>
<hr/>
<p>@ViewBag.StackTrace</p>
</div>
7、视图组件
不参与控制器生命周期,继承ViewComponent
传参@await Component.InvokeAsync("组件名称", new { 参数 = 值, 参数= 值 })
控制器中直接调用组件
public IActionResult IndexVC()
{ return ViewComponent("PriorityList", new { 参数 = 值, 参数= 值 }); }
给某某ViewComponent 指定特定的视图
public async Task<IViewComponentResult> InvokeAsync()
{ string MyView = "Default";
var items = await GetItemsAsync();
return View(MyView, items); }
8、分部视图
部视图不会运行 _ViewStart.cshtml
页面引用部分视图@await Html.PartialAsync("部分视图路径")
9、中间件
处理 HTTP 请求或响应的软件管道
在StartUp 的Configure()方法进行配置
中间件组件可以处理请求, 并决定不调用管道中的下一个中间件,从而使管道短路
app.Use(async (context, next) => {await next; // next 参数表示管道中的下一个委托,如果将这段代码注释则管道短路,不执行后面的中间件 });
中间件组件是按照添加到管道的顺序进行执行的
10、请求处理管道
通过这个HttpContext对象,中间件可以访问传入的 http 请求和传出的 http 响应
- 所有的
请求都会在每个中间件组件调用next()方法之前触发。依次穿过所有管道。 - 当中间件处理请求并产生响应时,请求处理流程在管道中开始反向传递。
- 所有的
响应都会在每个中间件组件调用next()方法之前触发。依次穿过所有管道
11、appsettings.json
相当于asp.net的web.config文件
访问配置信息,使用的是IConfiguration服务注入StartUp中,读取方法value=_configuration["MyKey"]
12、 launchSettings.json 文件
根文件夹的 Properties文件
此文件仅用于本地开发环境
从 Visual Studio 或使用.NET Core CLI 运行此 ASP.NET Core 项目时,将使用此文件中的设置
使用 GUI 我们可以更改launchSettings.json文件中的设置
13、模型绑定和模型验证
必填字段添加Required属性
使用ModelState.IsValid 属性会检查验证是否失败或成功


[Display(Name = "电子邮件")]字段设置显示名称
14、URL 重定向和 URL 重写
Url重定向是指客户端访问与客户端最初请求地址不同的资源,例如客户访问的是baidu.com ,IIS把baidu.com 重定向为www.baidu.com
URL 重写是服务器端操作,它从与客户端请求的资源地址不同的资源地址提供资源。 重写 URL 不需要往返服务器。 重写的 URL 不会返回客户端,也不会出现在浏览器地址栏。
URL 重写中间件
using (StreamReader iisUrlRewriteStreamReader =
File.OpenText("IISUrlRewrite.xml"))
{
var options = new RewriteOptions()
.AddRedirect("redirect-rule/(.*)", "redirected/$1")
.AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2",
skipRemainingRules: true)
.AddApacheModRewrite(apacheModRewriteStreamReader)
.AddIISUrlRewrite(iisUrlRewriteStreamReader)
.Add(MethodRules.RedirectXmlFileRequests)
.Add(MethodRules.RewriteTextFileRequests)
.Add(new RedirectImageRequests(".png", "/png-images"))
.Add(new RedirectImageRequests(".jpg", "/jpg-images"));
app.UseRewriter(options);
}
15、路由
常规路由:当来自浏览器的请求到达我们的应用程序时,MVC 中的控制器会处理传入的 http 请求并响应用户操作,请求URL会被映射到控制器的操作方法上。这个映射过程就是由应用程序中定义的路由规则完成
例如:当向/Home/Index 发出请求时,此URL将映射到HomeController类中的 Index()操作方法
asp.net core mvc 默认路由
app.UseMvcWithDefaultRoute();将这个中间件添加到管道中则可以用默认路由
public static IApplicationBuilder UseMvcWithDefaultRoute(this IApplicationBuilder**app)
{
if (app == null)
{
throw new ArgumentNullException(nameof(app));
}
return app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
app.UseMvc(routes =>
{
routes.MapRoute("default","{controller**=**Home}/{action = Index}/{id?}");
});
app.UseMvc()可以定义自己的路径模板并希望更多地控制路径
属性路由:在配置中间管道的时候,只使用app.UseMvc(),但不进行配置路由
使用Route()属性来定义路由。我们可以在控制器或 控制器 的操作方法上应用Route属性。
[Route("")]
[Route("Home")]
[Route("Home/Index")]
publicViewResultIndex()
{
returnView();
}
}
16、日志记录
在CreateDefaultBuilder()方法中配置
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.AddConsole();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
appsettings.json 文件中的 Logging 的LogLevel 用于控制记录或显示的日志数据量
日志级别
日志级别(ASP.NET Core 定义了以下日志级别(按严重性从低到高排列)。
跟踪 = 0
有关通常仅用于调试的信息。 这些消息可能包含敏感应用程序数据,因此不得在生产环境中启用它们。 默认情况下禁用。
调试 = 1
有关在开发和调试中可能有用的信息。 示例:Entering method Configure with flag set to true. 由于日志数量过多,因此仅当执行故障排除时,才在生产中启用 Debug 级别日志。
信息 = 2
用于跟踪应用的常规流。 这些日志通常有长期价值。 示例:Request received for path /api/todo
警告 = 3
表示应用流中的异常或意外事件。 可能包括不会中断应用运行但仍需调查的错误或其他条件。 Warning 日志级别常用于已处理的异常。 示例:FileNotFoundException for file quotes.txt.
错误 = 4
表示无法处理的错误和异常。 这些消息指示的是当前活动或操作(例如当前 HTTP 请求)中的失败,而不是整个应用中的失败。 日志消息示例:Cannot insert record due to duplicate key violation.
严重 = 5
需要立即关注的失败。 例如数据丢失、磁盘空间不足。
16、razor语法
条件语句@if elseif 和@switch
@("<span>Hello World</span>")
@inject 将服务从服务容器注入到视图
@model 将模型传到页面上
@namespace

浙公网安备 33010602011771号