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,依赖关系如下图:
-
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
的方法:
- 以上例来说,通过回传
方法,可以找到该Controller & Action对应的View
,并且把UserModel传给View使用。*.cshtml
-
HTTP Status Code
响应包含HTTP Status。常用的响应有
、Ok
BadRequest
NotFound
等。
例如:
,会响应HTTP Status 400及Internal Server Error字串。return BadRequest("Internal Server Error")
-
Redirect
可以把Request转给其他的Action或URL。转向的方法有
Redirect
LocalRedirect
RedirectToAction
RedirectToRoute
,就会把Request转向到AuthenticationController的Login()。return RedirectToAction("Login", "Authentication")
-
Formatted Response
响应时指定Content-Type。Web API的回传通常都用这种方式,序列化对象顺便标注Content-Type。
,会将对象序列化成JSON字串,并在HTTP Headers带上Content-Type=application/json。return Json(user)
View跟Controller有相互的对应关系,预设在Controller使用
View
方法回传结果,会从以下目录寻找对应的
*.cshtml
:
-
Views\{ControllerName}\{ActionName}.cshtml
寻找与Controller同名的子目录,再找到与Action同名的
如上例*.cshtml
,就会找项目目录下的HomeController.Index()
文件。Views\Home\Index.cshtml
-
Views\Shared\{ActionName}.cshtml
如果Controller同名的子目录,找不到Action同名的
。就会到Shared目录找。如上例*.cshtml
HomeController.Index()
Views\Shared\Index.cshtml文件
Views\Home\Index.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