.net core mvc启动顺序以及主要部件4-MVC

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

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

 public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {

            services.AddMvc();
        }

        public void Configure(IApplicationBuilder app, Microsoft.AspNetCore.Hosting.IHostingEnvironment environment)
        {
            if (environment.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseMvcWithDefaultRoute();
        }
    }

 我们.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的Action, 返回值类型是一个实现了IActionResult接口的实例,这里返回的是View

 public class HomeController: Controller
    {

        public IActionResult Index()
        {
            return View();
        }

    }

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

 public class ViewModel<T> where T : class
    {
        public string Title { get; set; }
        public IEnumerable<T> Data { get; set; }
    }

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

public class IndexModel
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
    }

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

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

 public class HomeService
    {
        private  IEnumerable<IndexModel> _sourceData = new List<IndexModel>
        {
            new IndexModel { Id = 1, Description = "my is code1", Name = "test1" },
             new IndexModel { Id = 2, Description = "my is code2", Name = "test2" },
              new IndexModel { Id = 3, Description = "my is code3", Name = "test3" },
               new IndexModel { Id = 4, Description = "my is code4", Name = "test4" },
                new IndexModel { Id = 5, Description = "my is code5", Name = "test5" },
        };
        public ViewModel<IndexModel> GetData(int id)
        {
            return new ViewModel<IndexModel>
            {
                Title = "Index",
                Data = id > 0 ? _sourceData.Where(x => x.Id == id) : _sourceData
            };
        }
    }

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

 

 public class HomeController: Controller
    {
        private readonly HomeService _service;

        public HomeController(HomeService service)
        {
            _service = service;
        }

        public IActionResult Index()
        {
            var data = _service.GetData();
            return View(data);
        }

    }

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

@model ViewModel<IndexModel>;
@{
    ViewData["Title"] = Model.Title;
}
<ul>
    @foreach (var item in Model.Data)
    {
        <li>
            <span>名称:@item.Name</span>
            <span>说明:@item.Description</span>
            <a asp-action="details" asp-route-id="@item.Id">详细</a>
        </li>
    }
</ul>

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

<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方法,代码如下:
   public IActionResult Details(int id)
        {
            var data = _service.GetData(id);             data.Title = "Details";
            return View(data);
        }

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

@model  ViewModel<IndexModel>
@{
    ViewData["Title"] = Model.Title;
    var data = Model.Data.FirstOrDefault();
}

    <p>@data.Name,@data.Description,@data.Id</p>

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

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

好啦,mvc大致情况就介绍到这里,后面会详细说说Views这个文件夹中的一些规则以及,有兴趣的也可以去官网看看https://docs.microsoft.com/zh-cn/aspnet/core/razor-pages/?view=aspnetcore-2.2&tabs=visual-studio

原文地址:https://www.cnblogs.com/lvshunbin/p/11113487.html

时间: 2024-11-13 08:57:36

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

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

前一篇提到WebHost.CreateDefaultBuilder(args)方法创建了WebHostBuilder实例,WebHostBuilder实例有三个主要功能 1.构建了IConfiguration实例和基础环境配置,2.构建了IServiceCollection服务,也就是依赖注入的容器,3.创建了webhost实例,这个webhost就是我们的接收请求的第一个管道,其中暴露出来的主要方法Build,请看源代码: 1 public IWebHost Build() 2 { 3 if

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

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

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

目录 C# VS JAVA 基础语法类比篇: 一.匿名类 二.类型初始化 三.委托(方法引用) 四.Lambda表达式 五.泛型 六.自动释放 七.重写(override) ASP.NET CORE VS Spring Boot 框架部署类比篇: 一.引用依赖(包) 二.依赖注入 DI (IOC容器) 三.过滤器.拦截器 AOP 四.配置读取 五.发布.部署.运行 我(梦在旅途,http://zuowj.cnblogs.com; http://www.zuowenjun.cn)最近发表的一篇文章

Tomcat配置文件与启动顺序

三个配置应用的位置: 1.conf目录下的server.xml文件:此方式为Eclipse默认配置方法,同时也是三种方式中优先级最高的. <?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE

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

本文转自:http://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-4_4_3-filters.html 原文:Filters 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:何镇汐 ASP.NET MVC 过滤器 可在执行管道的前后特定阶段执行代码.过滤器可以配置为全局有效.仅对控制器有效或是仅对 Action 有效. 查看或下载演示代码. 过滤器如何工作? 不同的过滤器类型会在执行管道的不同阶段运行,因此它们各自有一套适用场景.根

查看内核启动顺序 设置默认启动内核

查看内核 uname -r 查看默认启动顺序 awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg CentOS Linux (3.18.3-1.el7.elrepo.x86_64) 7 (Core) CentOS Linux, with Linux 3.10.0-123.el7.x86_64 CentOS Linux, with Linux 0-rescue-893b160e363b4ec7834719a7f06e67cf 默认启

ASP.NET Core 中文文档 第四章 MVC(3.2)Razor 语法参考

原文:Razor Syntax Reference 作者:Taylor Mullen.Rick Anderson 翻译:刘怡(AlexLEWIS) 校对:何镇汐 什么是 Razor? Razor 是一种基于服务器端代码的可以转换为网页的标记语法.Razor 语法包括 Razor 标记.C# 和 HTML 组成.包含 Razor 的文件通常后缀名为 .cshtml . 渲染 HTML Razor 的默认语言是 HTML.从 Razor 渲染为 HTML 和直接一个 HTML 文件没啥区别,这种 R

在 ASP.NET Core 程序启动前运行你的代码

原文:在 ASP.NET Core 程序启动前运行你的代码 一.前言# 在进行 Web 项目开发的过程中,可能会存在一些需要经常访问的静态数据,针对这种在程序运行过程中可能几乎不会发生变化的数据,我们可以尝试在程序运行前写入到缓存中,这样在系统后续使用时就可以直接从缓存中进行获取,从而减缓因为频繁读取这些静态数据造成的应用数据库服务器的巨大承载压力. 既然需要在程序运行前将静态数据写入到缓存中,毫无疑问我们需要在程序运行前执行一些自定义功能的代码,那么在本章中,我将会介绍如何在 ASP.NET

[CrunchBang]修改win+ubuntu 双 系统菜单的 启动顺序 引导

说到启动就不得不说GRUB,Linux下大名鼎鼎的启动管理工具(曾经的LILO已经风光不再),当然现在已经是GRUB2了,GRUB2和GRUB最重要的区别就是,GRUB存放系统启动信息的文件为/boot/grub/menu.lst,而GRUB2则为/boot/grub/grub.cfg.由于ubuntu10.10采用的是GRUB2,所以这里主要讲GRUB2. 终端输入gedit /boot/grub/grub.cfg,打开这个文件,开头几行注释如下: # # DO NOT EDIT THIS F