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

  • 相关阅读:
    Encrypted Handshake Message
    RSAParameters Struct
    What if JWT is stolen?
    What's the difference between JWTs and Bearer Token?
    RSA Algorithm Example
    第18届Jolt大奖结果公布
    Ruby on rails开发从头来(windows)(三十六) 调试技巧
    Ruby on rails开发从头来(四十二) ActiveRecord基础(主键和ID)
    YouTube开放基础技术架构 让用户建自家YouTube
    Ruby on rails开发从头来(四十) ActiveRecord基础(Boolean属性)
  • 原文地址:https://www.cnblogs.com/snaildev/p/9092213.html
Copyright © 2011-2022 走看看