天天看点

ASP.NET Core 2 学习笔记(六)MVC

原文: 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,把网站分成三大元件Model、View及Controller,依赖关系如下图:

ASP.NET Core 2 学习笔记(六)MVC
  • Model

    负责数据处理,包含数据存取、业务逻辑、定义数据对象及验证数据。

  • View

    负责UI显示,如HTML、CSS等界面设计配置。

  • Controller

    负责将使用者Requset找到相对应的Model及View,做为控制流程的角色。

在ASP.NET Core中使用MVC或Web API,需要

Microsoft.AspNetCore.Mvc

套件。

注册MVC 服务

在Startup.cs的

ConfigureServices

加入MVC的服务,并在

Configure

IApplicationBuilder

使用

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 用于Controller 跟View 互动。

Models\UserModel.cs

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

在项目目录下建立一个Controllers文件夹,把Controller都放这个目录。

过去ASP.NET把MVC及Web API用的Controller分为

Controller

ApiController

,现在ASP.NET Core把两者合一,不再区分

ApiController

所以要建立一个类,名称后缀Controller即可,如下:

Controllers\HomeController.cs

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

但要让Controller跟View互动,还是需要继承

Controller

比较方便,如下:

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

    方法,可以找到该Controller & Action对应的

    *.cshtml

    ,并且把UserModel传给View使用。
  • HTTP Status Code

    响应包含HTTP Status。常用的响应有

    Ok

    BadRequest

    NotFound

    等。

    例如:

    return BadRequest("Internal Server Error")

    ,会响应HTTP Status 400及Internal Server Error字串。
  • Redirect

    可以把Request转给其他的Action或URL。转向的方法有

    Redirect

    LocalRedirect

    RedirectToAction

    RedirectToRoute

    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跟Controller有相互的对应关系,预设在Controller使用

View

方法回传结果,会从以下目录寻找对应的

*.cshtml

  1. Views\{ControllerName}\{ActionName}.cshtml

    寻找与Controller同名的子目录,再找到与Action同名的

    *.cshtml

    如上例

    HomeController.Index()

    ,就会找项目目录下的

    Views\Home\Index.cshtml

    文件。
  2. Views\Shared\{ActionName}.cshtml

    如果Controller同名的子目录,找不到Action同名的

    *.cshtml

    。就会到Shared目录找。如上例

    HomeController.Index()

    Views\Shared\Index.cshtml文件

Views\Home\Index.cshtml

@model MyWebsite.Models.UserModel

Hello~ 我是 @Model.Name
      

*.cshtml

@model

绑定Model的型别,才可以使用

@Model

取得Controller传入的对象。

示例结果

ASP.NET Core 2 学习笔记(六)MVC

数据流动图如下:

ASP.NET Core 2 学习笔记(六)MVC

参考

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

老司机发车啦:

https://github.com/SnailDev/SnailDev.NETCore2Learning