zoukankan      html  css  js  c++  java
  • ASP.NET Core 2 学习笔记(六)MVC

     ASP.NET Core MVC跟ASP.NET MVC观念是一致的,使用上也没有什么太大的变化。之前的ASP.NET MVC把MVC及Web API的套件分开,但在ASP.NET Core中MVC及Web API用的套件是相同的。

    本篇将介绍ASP.NET Core MVC设置方式。

    MVC 简介

    ASP.NET Core的MVC(Model-View-Controller)架构模式延续ASP.NET MVC,把网站分成三大元件ModelViewController,依赖关系如下图:

    • Model
      负责数据处理,包含数据存取、业务逻辑、定义数据对象及验证数据。
    • View
      负责UI显示,如HTML、CSS等界面设计配置。
    • Controller
      负责将使用者Requset找到相对应的Model及View,做为控制流程的角色。

    在ASP.NET Core中使用MVC或Web API,需要Microsoft.AspNetCore.Mvc套件。

    注册MVC 服务

    Startup.csConfigureServices加入MVC的服务,并在ConfigureIApplicationBuilder使用UseMvcWithDefaultRoute方法注册MVC预设路由的Middleware。如下:

    Startup.cs

    // ...
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
        }
    
        public void Configure(IApplicationBuilder app)
        {
            app.UseMvcWithDefaultRoute();
        }
    }
    
    • UseMvcWithDefaultRoute

    这个是ASP.NET Core的预设路由,会将Request来的URL找到对应的Controller及Action。

     

    MVC 示例

    Model

    建立一个简单的Model 用于Controller 跟View 互动。

    ModelsUserModel.cs

    namespace MyWebsite.Models
    {
        public class UserModel
        {
            // 名称
            public string Name { get; set; } = "SnailDev";
        }
    }
    

     

    Controller

    在项目目录下建立一个Controllers文件夹,把Controller都放这个目录。
    过去ASP.NET把MVC及Web API用的Controller分为ControllerApiController,现在ASP.NET Core把两者合一,不再区分ApiController
    所以要建立一个类,名称后缀Controller即可,如下:

    ControllersHomeController.cs

    namespace MyWebsite.Controllers
    {
        public class HomeController
        {
            public string Index()
            {
                return "this is homecontroller index action";
            }
        }
    }
    

    但要让Controller跟View互动,还是需要继承Controller比较方便,如下:

    ControllersHomeController.cs

    using Microsoft.AspNetCore.Mvc;
    using MyWebsite.Models;
    
    namespace MyWebsite.Controllers
    {
        public class HomeController : Controller
        {
            public IActionResult Index()
            {
                var user = new UserModel();
                return View(model: user);
            }
        }
    }
    

    IActionResult回传的方式可以有很多种,通过继承Controller后,就可以使用Controller的方法:

    • View
      以上例来说,通过回传View方法,可以找到该Controller & Action对应的*.cshtml,并且把UserModel传给View使用。
    • HTTP Status Code
      响应包含HTTP Status。常用的响应有OkBadRequestNotFound等。
      例如:return BadRequest("Internal Server Error"),会响应HTTP Status 400及Internal Server Error字串。
    • Redirect
      可以把Request转给其他的Action或URL。转向的方法有RedirectLocalRedirectRedirectToActionRedirectToRoute等。
      例如:return RedirectToAction("Login", "Authentication"),就会把Request转向到AuthenticationController的Login()。
    • Formatted Response
      响应时指定Content-Type。Web API的回传通常都用这种方式,序列化对象顺便标注Content-Type。
      例如:return Json(user),会将对象序列化成JSON字串,并在HTTP Headers带上Content-Type=application/json

     

    View

    View跟Controller有相互的对应关系,预设在Controller使用View方法回传结果,会从以下目录寻找对应的*.cshtml

    1. Views{ControllerName}{ActionName}.cshtml
      寻找与Controller同名的子目录,再找到与Action同名的*.cshtml
      如上例HomeController.Index(),就会找项目目录下的ViewsHomeIndex.cshtml文件。
    2. ViewsShared{ActionName}.cshtml
      如果Controller同名的子目录,找不到Action同名的*.cshtml。就会到Shared目录找。如上例HomeController.Index(),就会找项目目录下的ViewsSharedIndex.cshtml文件

    ViewsHomeIndex.cshtml

    @model MyWebsite.Models.UserModel
    
    Hello~ 我是 @Model.Name
    

    *.cshtml@model绑定Model的型别,才可以使用@Model取得Controller传入的对象。

    示例结果

    数据流动图如下:

    参考

    Overview of ASP.NET Core MVC 
    ASP.NET Core - Setup MVC

    老司机发车啦:https://github.com/SnailDev/SnailDev.NETCore2Learning

  • 相关阅读:
    Haskell语言学习笔记(76)Data.Tree
    C++17尝鲜:编译期 if 语句
    C++17尝鲜:variant
    Haskell语言学习笔记(75)Conduit
    C++17尝鲜:string_view
    Haskell语言学习笔记(74)GADTs
    Haskell语言学习笔记(73)Existentials
    Haskell语言学习笔记(72)Free Monad
    sum of powers
    「2017 山东一轮集训 Day7」逆序对
  • 原文地址:https://www.cnblogs.com/snaildev/p/9092213.html
Copyright © 2011-2022 走看看