前面三章已经把MVC启动过程以及源代码做了讲解,本章开始正式MVC,mvc全称叫model view controller,也就是把表现层又细分三层,官网的图片描述:

默认创建了一个.net core web 项目,把Startup类中的代码改成下面这样

  1. public class Startup
  2. {
  3. public void ConfigureServices(IServiceCollection services)
  4. {
  5.  
  6. services.AddMvc();
  7. }
  8.  
  9. public void Configure(IApplicationBuilder app, Microsoft.AspNetCore.Hosting.IHostingEnvironment environment)
  10. {
  11. if (environment.IsDevelopment())
  12. {
  13. app.UseDeveloperExceptionPage();
  14. }
  15. app.UseMvcWithDefaultRoute();
  16. }
  17. }

 我们.net core mvc是基于约定的一种模式,例如:控制器是放在Controllers文件夹中的(当然这不是必须),视图放在pages或者views文件夹中等,首先我们讲讲Controller的约定,先不管例外的情况,我们要定义一个Controller首先要继承至Microsoft.AspNetCore.Mvc.Controller类并且符合下面其中之一的条件:

1、这个类名称后缀是以Controller结尾

例如:新建一个Home类,那么它的签名应该像这样:public class HomeController : Controller

2、继承至带有Controller后缀名的基类,

例如:你已经创建好了一个BaseController基类,现在需要创建Home类,那么他的签名可以是这样:public class Home : BaseController

3、这个类带有[Controller]标签

例如:新建一个Home类,那么它的签名应该像这样:

[Controller]

public class Home : Controller

在Controller类里面写的方法,我们称为Action,例如下面,这就创建了一个名为Index的方法, 返回值类型是一个实现了IActionResult接口的实例,这里返回的是View

  1. public class HomeController: Controller
  2. {
  3.  
  4. public IActionResult Index()
  5. {
  6. return View();
  7. }
  8.  
  9. }

在这里先说说View()这个方法到底干了什么事儿吧,我们转到源代码可以看到最终View是创建了一个ViewResult这个类,这个类又继承至ActionResult并且实现了IActionResult接口,其中最主要 ExecuteResultAsync方法就是返回给我们前端的数据,ViewResult这个类中有两个我们常用的属性,分别是ViewName和ViewData,分别代表"视图的名称"和"视图需要的数据",如果视图名称不传那么就约定以控制器Action名称为准,否则已传入名称为准,如果传入ViewData那么就可以在视图中的Model属性里面访问到传入的数据,并且转换为强类型,就以上面的例子,我们在Views文件夹中创建一个Home文件夹和Index.cshtml视图文件,并且在Models文件夹中创建两个实体,一个为通用的ViewModel,代码如下:

  1. public class ViewModel<T> where T : class
  2. {
  3. public string Title { get; set; }
  4. public IEnumerable<T> Data { get; set; }
  5. }

  另一个是具体的Action视图所需的数据实体,所以名称为IndexModel,具体代码如下:

  1. public class IndexModel
  2. {
  3. public int Id { get; set; }
  4. public string Name { get; set; }
  5. public string Description { get; set; }
  6. }

 另外我们再写一个获取Index数据的服务,名称为HomeService,并且在Startup类的ConfigureServices方法中最前面加上services.AddScoped<HomeService>();

先不管是否符合设计规范,这样做完后我们就可以在其他实体中注入HomeService的实例了,我们HomeService中代码可以是这样的:

  1. public class HomeService
  2. {
  3. private IEnumerable<IndexModel> _sourceData = new List<IndexModel>
  4. {
  5. new IndexModel { Id = 1, Description = "my is code1", Name = "test1" },
  6. new IndexModel { Id = 2, Description = "my is code2", Name = "test2" },
  7. new IndexModel { Id = 3, Description = "my is code3", Name = "test3" },
  8. new IndexModel { Id = 4, Description = "my is code4", Name = "test4" },
  9. new IndexModel { Id = 5, Description = "my is code5", Name = "test5" },
  10. };
  11. public ViewModel<IndexModel> GetData(int id)
  12. {
  13. return new ViewModel<IndexModel>
  14. {
  15. Title = "Index",
  16. Data = id > 0 ? _sourceData.Where(x => x.Id == id) : _sourceData
  17. };
  18. }
  19. }

 这个时候将HomeController中的代码改成这样

 

  1. public class HomeController: Controller
  2. {
  3. private readonly HomeService _service;
  4.  
  5. public HomeController(HomeService service)
  6. {
  7. _service = service;
  8. }
  9.  
  10. public IActionResult Index()
  11. {
  12. var data = _service.GetData();
  13. return View(data);
  14. }
  15.  
  16. }

然后转到视图文件,视图中代码如下:

  1. @model ViewModel<IndexModel>;
  2. @{
  3. ViewData["Title"] = Model.Title;
  4. }
  5. <ul>
  6. @foreach (var item in Model.Data)
  7. {
  8. <li>
  9. <span>名称:@item.Name</span>
  10. <span>说明:@item.Description</span>
  11. <a asp-action="details" asp-route-id="@item.Id">详细</a>
  12. </li>
  13. }
  14. </ul>

 在视图里面有一句代码值得注意

  1. <a asp-action="details" asp-route-id="@item.Id">详细</a>
    这个是.net core改进部分,它叫做 TagHelpers,它是由.net core解析,最终变成正常的src属性或者其他html属性,这样做的好处是更加接近于html本身的编程方式,
    这里有注意到我们定义的asp-action="details"表示的是转到当前视图的控制器details方法中,最终会生成的url path是这样 /home/details?id={id},
    为了能够正常的运行,我们需要创建一个details方法,代码如下:
  1. public IActionResult Details(int id)
  2. {
  3. var data = _service.GetData(id);
     data.Title = "Details";
  4. return View(data);
  5. }

  在创建details的视图文件,代码如下:

  1. @model ViewModel<IndexModel>
  2. @{
  3. ViewData["Title"] = Model.Title;
  4. var data = Model.Data.FirstOrDefault();
  5. }
  6.  
  7. <p>@data.Name,@data.Description,@data.Id</p>

  然后我们运行程序,会看到如下界面:

点击"详细"  会出现以下界面:

好啦,mvc大致情况就介绍到这里,有兴趣的也可以去官网看看https://docs.microsoft.com/zh-cn/aspnet/core/razor-pages/?view=aspnetcore-2.2&tabs=visual-studio

.net core mvc启动顺序以及主要部件4-MVC的更多相关文章

  1. .net core mvc启动顺序以及主要部件2

    原文:.net core mvc启动顺序以及主要部件2 前一篇提到WebHost.CreateDefaultBuilder(args)方法创建了WebHostBuilder实例,WebHostBuil ...

  2. .net core mvc启动顺序以及主要部件1

    原文:.net core mvc启动顺序以及主要部件1 首先我是新人一个写这些东西也是为了增加记忆,有不对的地方请多多指教. 说回正题,打开Program.cs文件,看到在有个CrateWebHost ...

  3. .net core mvc启动顺序以及主要部件3-Startup

    前面分享了.net core Program类的启动过程已经源代码介绍,这里将继续讲Startup类中的两个约定方法,一个是ConfigureServices,这个方法是用来写我们应用程序所依赖的组件 ...

  4. PCB MVC启动顺序与各层之间数据传递对象关系

    准备着手基于MVC模式写一套Web端流程指示查看,先着手开发WebAPI打通数据接口,后续可扩展手机端 这里将MVC基本关系整理如下: 一.MVC启动顺序 二.MVC各层之间数据传递对象关系

  5. ASP.NET Core MVC 源码学习:MVC 启动流程详解

    前言 在 上一篇 文章中,我们学习了 ASP.NET Core MVC 的路由模块,那么在本篇文章中,主要是对 ASP.NET Core MVC 启动流程的一个学习. ASP.NET Core 是新一 ...

  6. ASP.NET Core 3.x控制IHostedService启动顺序浅探

    想写好中间件,这是基础.   一.前言 今天这个内容,基于于ASP.NET Core 3.x. 从3.x开始,ASP.NET Core使用了通用主机模式.它将WebHostBuilder放到了通用的I ...

  7. [转]ASP.NET Core 中文文档 第四章 MVC(4.3)过滤器

    本文转自:http://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-4_4_3-filters.html 原文:Filters 作者:Steve Smith 翻 ...

  8. 干货分享:ASP.NET CORE(C#)与Spring Boot MVC(JAVA)异曲同工的编程方式总结

    目录 C# VS JAVA 基础语法类比篇: 一.匿名类 二.类型初始化 三.委托(方法引用) 四.Lambda表达式 五.泛型 六.自动释放 七.重写(override) ASP.NET CORE ...

  9. ASP.NET CORE(C#)与Spring Boot MVC(JAVA)

    干货分享:ASP.NET CORE(C#)与Spring Boot MVC(JAVA)异曲同工的编程方式总结   目录 C# VS JAVA 基础语法类比篇: 一.匿名类 二.类型初始化 三.委托(方 ...

随机推荐

  1. 安装centos6.10时,安装完成重启报错error 15,file not found

    今天在一台老式联想服务器上安装centos6.10操作系统,安装完成,重启时,出现报错 error 15, file not found...... 在百度上搜索到进grub编辑,可还是无法解决问题, ...

  2. Ubuntu 开发环境搭建教程

    Ubuntu 开发环境搭建教程 本文原始地址:https://sitoi.cn/posts/18425.html 更新 sudo apt upgrade sudo apt update 生成本机密钥 ...

  3. 基于Redisson+SpringBoot的Redission分布式锁

    原文:https://blog.csdn.net/sunct/article/details/80178197 定义分布式锁接口 package com.redis.lock.redisson_spr ...

  4. MySQL 学习网站

    [大型网站] CSDN论坛MySQL版块 https://bbs.csdn.net/forums/MySQL MySlide搜索MySQL https://myslide.cn/slides/1758 ...

  5. Navicat Premium永久激活方式

    今天安装完Navicat Premium,运行时出现只能用14天的信息,所以就比较生气,只能用14天,那我还下你干啥,所以就查教程,弄了个破解工具,最后大功告成,应该是可以永久使用了,具体的教程看下 ...

  6. Codeforces Round #606 (Div. 2) E - Two Fairs(DFS,反向思维)

  7. Quay: Introducing an Application Registry for Kubernetes

    转自: https://coreos.com/blog/quay-application-registry-for-kubernetes.html When we started Quay, we w ...

  8. Vim编辑器点滴积累

    Vim编辑器点滴积累 vim tab键空格数量控制 参考链接 临时:进入VIM,执行: :set tabstop=4 永久:编辑用户目录下.vimrc文件,添加:set tabstop=4 vim 安 ...

  9. 【CSP-S膜你考】不怕噩梦 (模拟)

    不怕噩梦 题面 蚊子最近经常做噩梦,然后就会被吓醒.这可不好.. 疯子一直在发愁,然后突然有一天,他发现蚊子其实就是害怕某些事. 如果那些事出现在她的梦里,就会害怕. 我们可以假定那个害怕的事其实是一 ...

  10. spark基础知识三

    主要围绕spark的底层核心抽象RDD和原理进行理解.主要包括以下几个方面 RDD弹性分布式数据集的依赖关系 RDD弹性分布式数据集的lineage血统机制 RDD弹性分布式数据集的缓存机制 spar ...