[七]asp.netcoremvc的设计模式(代码片段)

长不大的大灰狼 长不大的大灰狼     2022-12-18     140

关键词:

1、MVC

模型(Model),视图(View)、控制器(Controller)。 它是用于实现应用程序的用户界面层的架构设计模式。 一个典型的实际应用程序通常具有以下层:

  • 用户展现层
  • 业务逻辑处理层
  • 数据访问读取层 MVC 设计模式通常用于实现应用程序的用户界面层。

2、MVC 如何工作

  • 当我们的请求到达服务器时,作为 MVC 设计模式下的 Controller,会接收请求并且处理它。Controller 会创建模型(Model),该模型是一个类文件,会进行数据的展示。
  • 在 Molde 中,除了数据本身,Model 还包含从底层数据源(如数据库)查询数据后的逻辑信息。
  • 除了创建 Model 之外,控制器还选择 View 并将 Model 对象传递给该 View。
  • 视图仅负责呈现 Modle 的数据。
  • 视图会生成所需的 HTML 以显示模型数据,即 Controller 提供给它的学生数据。然后,此 HTML通过网络发送,最终呈现在发出请求的用户面前。

2、在 ASP.NET Core 中安装 MVC

步骤 1: 将所需的 MVC 服务添加到 ASP.NET Core 中的依赖注入容器中。在 Startup.cs 文件中的 Startup 类的ConfigureServices()方法中,加入services.AddMvc();

步骤 2: 在 Configure()方法中,将UseMvcWithDefaultRoute()中间件添加到应用程序的请求处理管道中。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)

    if (env.IsDevelopment())
    
        app.UseDeveloperExceptionPage();
    

    app.UseStaticFiles();

    app.UseMvcWithDefaultRoute();

    app.Run(async (context) =>
    
        await context.Response.WriteAsync("Hello World!");
    );

注意:
UseMvcWithDefaultRoute()中间件之前放置了UseStaticFiles()中间件。因为如果请求是针对静态文件(如图像,CSS 或 JavaScript 文件),则UseStaticFiles()中间件将处理请求并使管道的其余部分短路。即不会再往下执行。

3、UseMvcWithDefaultRoute()

请求根路径http://localhost:49119,并未在 URL 中指定控制器和操作方法时, UseMvcWithDefaultRoute()中间件会在 HomeController 中查找 Index()方法。

public class HomeController

    public string Index()
    
        return "Hello from MVC";
    

4、AddMvc 和 AddMvcCore 是什么关系

在 Startup 类的 ConfigureServices()方法中可以调用 IServiceCollection 接口的 AddMvc()方法和AddMvcCore()方法。


AddMvcCore()方法只添加核心 MVC 服务。AddMvc()方法添加所有必需的 MVC 服务。AddMvc()方法在内部调用 AddMvcCore()方法,以添加所有核心 MVC 服务。

想要返回 HTML 视图或 JSON 数据, HomeController 类必须继承框架提供的 Controller 类。Controller 基类提供了返回不同结果的支持,如 JsonResult,ViewResult,PartialViewResult 等。

public class HomeController : Controller

    public JsonResult Index()
    
        return Json(new  id=1, name="pragim" );
    

5、ASP.NET Core MVC 中的 Model 模型

实体类:

public class Student
    
        public int Id  get; set; 
        public string Name  get; set; 
        public string Major  get; set; 

接口:

public interface IStudentRepository
    
        Student GetStudent(int id);

    

实现:

public class MockStudentRepository : IStudentRepository
    
        private List<Student> _studentList;

        public MockStudentRepository()
        
            _studentList = new List<Student>()
            
            new Student()  Id = 1, Name = "张三", Major = "一年级", Email = "Tony-zhang@52abp.com" ,
            new Student()  Id = 2, Name = "李四", Major = "二年级", Email = "lisi@52abp.com" ,
            new Student()  Id = 3, Name = "王二麻子", Major = "二年级", Email = "wang@52abp.com" ,
            ;
        


        public Student GetStudent(int id)
        
            return _studentList.FirstOrDefault(a => a.Id == id);
        

6、ASP.NET Core 中的 依赖注入介绍

使用构造函数将IStudentRepository实例注入HomeController。

public class HomeController : Controller
    
        private IStudentRepository _studentRepository;

       //使用构造函数注入的方式注入IStudentRepository
        public HomeController(IStudentRepository studentRepository)
        
            _studentRepository = studentRepository;
        


       //返回学生的名字
        public string Index()
        
      return      _studentRepository.GetStudent(1).Name;
        

此时如果有人请求实现IStudentRepository的对象,ASP .NET Core 依赖注入容器不知道要提供哪个对象实例。

ASP.NET Core 提供3 种方法来使用依赖项注入容器注册服务:

  • AddSingleton():所有请求复用一个单例
  • AddTransient():同一个Http请求范围内,每次使用该实例都会创建一个新的实例。
  • AddScoped():同一个Http请求范围内,使用同一个实例,但当又发起一个新请求时,会再次创建一个新的实例。

使用AddSingleton()向 ASP.NET Core 依赖注入容器注册MockStudentRepository类方法:

public void ConfigureServices(IServiceCollection services)

    services.AddMvc();
     services.AddSingleton<IStudentRepository, MockStudentRepository>();

7、ASP.NET CoreMVC 中的控制器

  • MVC 中的控制器是一个类,它继承自Microsoft.AspNetCore.Mvc.Controller。
  • 控制器类名称后缀为 “Controller”。例如 HomeController,StudentController。
  • 当来自浏览器的请求到达我们的应用程序时,作为 MVC 中的控制器,它会处理传入的 http 请求并响应用户操作。
  • Controller 类包含一组公共方法。Controller 类中的这些公共方法称为操作方法( action methods)。正是这些控制器的操作方法处理传入的 http 请求。
  • 假设用户在浏览器地址栏中键入了以下 URL 并按 ENTER 键http://localhost:12345/home/details
    URL"/home/details"会映射到 HomeController
    中的"Details"公共操作方法。此映射是由我们应用程序中的路由规则定义完成。
  • 请求到达控制器中的方法。作为处理该请求的一部分,控制器创建模型-Model。
  • 控制器通过依赖的服务,来查询模型数据。例如,我们要查询学生的数据,就需要通过 HomeController 依赖的IStudentRepository服务。

注意:
我们将注入的依赖项分配给readonly字段,可以防止在方法中意外地为其分配另一个值。

(1)返回数据
当控制器拥有所需的模型数据,比如我们正在提供服务或 RESTful API,它就可以简单地返回该模型数据。

1)JsonResult返回 JSON 数据,它不接受内容协商并忽略Accept Header。

  public class HomeController:Controller
    
        private readonly IStudentRepository _studentRepository;
        public HomeController(IStudentRepository studentRepository)
        
            _studentRepository = studentRepository;
        
        public JsonResult Details()
        
            Student model = _studentRepository.GetStudent(1);
            return Json(model);

        
    

2)ObjectResult如果请求头Accept Header设置为application/xml,则返回 XML 数据。如果设置为application/json,则返回 JSON 数据。

public class HomeController:Controller
    
        private readonly IStudentRepository _studentRepository;
        public HomeController(IStudentRepository studentRepository)
        
            _studentRepository = studentRepository;
        
       public ObjectResult Details()
        
            Student model = _studentRepository.GetStudent(1);
            return new ObjectResult(model);

        
    

注意:为了能够以 XML 格式返回数据,我们必须通过调用 Startup.cs 文件中的 ConfigureServices()方法中的 AddXmlSerializerFormatters()的方法。

public void ConfigureServices(IServiceCollection services)

    services.AddMvc().AddXmlSerializerFormatters();

3)ViewResult返回View:

public class HomeController:Controller
    
        private readonly IStudentRepository _studentRepository;
        public HomeController(IStudentRepository studentRepository)
        
            _studentRepository = studentRepository;
        
          public ViewResult Details()
        
            Student model = _studentRepository.GetStudent(1);
            return   View(model);
        

asp.netcoremvc视图(代码片段)

ASP.NETCoreMVC中视图的知识和ASP.NETMVC有很多相似之处,学习难度较低。以下内容主要体现了编程中模块化的思想,模块化才应是我们关注的重点。Layout布局用于提供各个页面所需的公共部分,如:菜单、页头、页尾等。在ASP.NETCore... 查看详情

使用asp.netcoremvc创建webapi(代码片段)

原文:使用ASP.NETCoreMVC创建WebAPI(四)使用ASP.NETCoreMVC创建WebAPI使用ASP.NETCoreMVC创建WebAPI(一)使用ASP.NETCoreMVC创建WebAPI(二) 使用ASP.NETCoreMVC创建WebAPI(三)十三、返回值     在上一篇文章(使用ASP.NETCoreMVC 查看详情

使用asp.netcoremvc创建webapi(代码片段)

原文:使用ASP.NETCoreMVC创建WebAPI(二)使用ASP.NETCoreMVC创建WebAPI使用ASP.NETCoreMVC创建WebAPI(一)  六、添加数据库上下文     数据库上下文是使用EntityFrameworkCore功能的主类。此类由Microsoft.EntityFrameworkCore. 查看详情

asp.netcoremvc2.x全面教程_asp.netcoremvc25.过滤器(代码片段)

在MVC的请求管道并不是 asp.netcore的请求管道。所以说Filter是专用于MVC的贯穿特性,横穿关注点。比如授权、日志这里的Authorize其实就是一个Filter,主要用来授权的比如这个Filter,我们要求必须使用Https才可以访问授权在整个... 查看详情

[十]asp.netcoremvc中的路由(代码片段)

路由1、ASP.NETCoreMVC中的路由(1)常规路由:(2)属性路由1、ASP.NETCoreMVC中的路由(1)常规路由:当来自浏览器的请求到达我们的应用程序时,MVC中的控制器会处理传入的http请求并响应用户操... 查看详情

使用asp.netcoremvc创建webapi(代码片段)

原文:使用ASP.NETCoreMVC创建WebAPI(一)     从今天开始来学习如何在ASP.NETCore中构建WebAPI以及每项功能的最佳适用场景。关于此次示例的数据库创建请参考《学习ASP.NETCoreRazor编程系列一》   至 《学... 查看详情

使用asp.netcoremvc创建webapi(代码片段)

原文:使用ASP.NETCoreMVC创建WebAPI(三)使用ASP.NETCoreMVC创建WebAPI使用ASP.NETCoreMVC创建WebAPI(一)使用ASP.NETCoreMVC创建WebAPI(二) 十、添加GetBookItem方法   1)在VisualStudio2017中的“解决方案资源管理器”中双击打开Bo 查看详情

asp.netcoremvc用时分析工具miniprofiler(代码片段)

...分析工具库,它可以用来分析ASP.NETCore应用。优点针对ASP.NETCoreMVC应用,使用MiniProfiler的优点是:它会把结果直接放在页面的左下角,随时可以点击查看;这样的话就可以感知出你的程序运行的怎么样;同时这也意味着,在你开... 查看详情

[九]asp.netcoremvc中的布局视图(代码片段)

布局视图1、布局视图2、ASP.NETCoreMVC中布局页面中Sections3、什么是_ViewStart.cshtml文件4、_ViewImports.cshtml文件1、布局视图Web应用程序网站通常由以下部分组成Header-头部Footer-页脚Menu-导航菜单View-具体内容的视图如果没有布局视图࿰... 查看详情

asp.netcoremvc过滤器介绍(代码片段)

原文:ASP.NETCoreMVC过滤器介绍过滤器的作用是在Action方法执行前或执行后做一些加工处理。使用过滤器可以避免Action方法的重复代码,例如,您可以使用异常过滤器合并异常处理的代码。过滤器如何工作?过滤器在MVCAction调用管道... 查看详情

备忘asp.netmvc5升级到asp.netcoremvc的部分变化(代码片段)

原文:【备忘】ASP.NETMVC5升级到ASP.NETCoreMVC的部分变化  正在将一个.net4.5的项目(MVC5)升级到.netcore2.1,中间遇到了许多的修改,记在下面,帮大家少走弯路。System.Drawing下面很多类已经不存在(如Bitmap),可以下载扩展包... 查看详情

如何使用 asp.net core mvc 在引导模式中加载 AngularJS 代码

】如何使用asp.netcoremvc在引导模式中加载AngularJS代码【英文标题】:howtoloadAngularJScodeinbootstrapmodalusingasp.netcoremvc【发布时间】:2020-11-2612:22:01【问题描述】:我想在引导模式中使用AngularJS代码我正在使用Jquery代码加载引导模式在... 查看详情

[mvc&core]asp.netcoremvc视图传值入门(代码片段)

前言1、本教程主要内容ASP.NETCoreMVC视图引擎(Razor)简介ASP.NETCoreMVC视图(Razor)ViewData使用示例ASP.NETCoreMVC视图(Razor)ViewBag使用示例ASP.NETCoreNVC视图(Razor)强类型传值(ViewModel)页示例2、本教程环境信息软件/环境说明操作系统Windows10SDK2.1.401... 查看详情

asp.netcoremvc中两种路由的简单配置(代码片段)

1.全局约定路由这种方式配置优先级比较低,如果控制器或者方法上标记了特性路由那么优先走特性路由。当建立好一个mvc项目里,路由都是默认配置好的。如果建立的是空项目那么需要手动配置:1.需要在ConfigureServices方法中添... 查看详情

asp.netcoremvc剖析:处理管道构建

在启动流程文章中提到,在WebHost类中,通过BuildApplication完成http请求处理管道的构建。在来看一下代码:。。。。。。//这个调用的就是Startup.cs类中的Configure方法configure(builder);//生成中间件链式结构returnbuilder.Build();在框架中,... 查看详情

asp.netcoremvc模型绑定:非规范正文内容的处理(代码片段)

本篇老周就和老伙伴们分享一下,对于客户端提交的不规范Body如何做模型绑定。不必多说,这种情况下,只能自定义ModelBinder了。而且最佳方案是不要注册为全局Binder——毕竟这种特殊情况是针对极少数情形的,咱们没必要去干... 查看详情

asp.netcoremvc压缩样式脚本及总是复制文件到输出目录(代码片段)

...中则无需借助第三方工具来完成,本节我们来看看ASP.NETCoreMVC为我们提供了哪些方便。自动压缩样式和脚本当我们在测试环境中肯定不需要压缩脚本的,如果一旦压缩脚本的话,若在控制台出现错误不利于我们调试... 查看详情

asp.netcoremvc2.x全面教程_asp.netcoremvc14.asp.netcoreidentity入门

默认的身份认证好授权系统UserManager用来操作用户的类,Singi用来身份认证的添加AccountController先声明SignInManager和UserManager这两个服务快捷键Ctrl+.两个都需要分别进行Ctrl+.快速的生成创建登陆的ActionLogin建立View创建LoginViewModel主要... 查看详情