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);
    }
Url重写中间件代码的写法

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?}");
    });
}
UseMvcWithDefaultRoute实现映射的方法

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

 

 

 
 
 
 

 

 

 

 

posted on 2020-06-12 13:24  郑土  阅读(440)  评论(0)    收藏  举报

导航