TOC

This article is currently in the process of being translated into Chinese (~80% done).

Getting Started:

Creating a Model

在前两篇文章中,我们创建了一个控制器以及一个视图,以此来快速上手。我们将二者组合起来,来创建一个简单的、基于HTML的网页。然而,现在我们的视图只是一个静态HTML文件,因为它只输出了基础HTML代码。MVC(模型-视图-控制器)背后的思想当然是将前端HTML代码与服务端生成的数据混合在一起,这也是模型所扮演的角色。

在MVC架构中,模型控制器生成,然后传给 视图,视图又将相关数据传给用户端。正如你在上一篇文章中所见,如果指定的页面中没有服务端生成的数据,我们就可以不用模型。但是一旦我们在页面中放入服务端生成的数据,我们就要用到模型。

但是模型到底长什么样?好吧,这实际上取决于你。因为模型可以是在ASP.NET MVC框架中的任何类型的对象。实际上它可以只是简单的数字或是字符串,也可能是一个复杂类的实例。例如,一个User类掌管了一位用户的信息,一个GuestbookEntry项目包含了留言簿上的一条内容或是其它东西。这意味着,你的模型可以是已经存在的类。例如,从数据库里取到的一些东西,或是你为某个或某几个视图特意创建的模型类。

添加一个模型

让我们来向HelloMVCWorld项目添加添加一个视图(这个项目是在前面讲控制器的文章中创建的)。对于下面这个例子,我们将创建一个新的模型,而不是依赖于项目中已经定义好的东西。

就像我们通常会在一个名为"Controllers"的文件夹中存放控制器以及在一个名为"Views"的文件夹中存放视图那样,我们将在项目的根目录添加一个名为"Models" 的文件夹。那么,就像我们在前面几篇文章中所做的,在解决方案浏览器中,使用鼠标右键点击项目名称然后选择添加 -> 新建文件夹。当你添加完"Models"文件夹之后,就是时候创建真正的模型了。如上文中所提到的,模型只是常规的类,那么我们就来添加一个类:

这个类要用于包含一部电影的基本信息,因此我们在弹出的对话框中简单输入Movie.cs作为新类的名称。Visual Studio将为你新建一个空的类,如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace HelloMVCWorld.Models
{
    public class Movie
    {
    }
}

让我们为其添加一些基础属性——这个类现在看起来像下面这样:

public class Movie
{
    public string Title { get; set; }
    public DateTime ReleaseDate { get; set; }
}

现在我们的模型类就准备好了。正如我们前面提到的,模型应该被控制器实例化。因此,让我们将目光移到在前一篇文章中创建的 HomeController 上。它之前只从Index()方法返回了一个视图,像这样:

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

但现在,让我们修改此方法的代码,使它返回一个夹带模型的视图:

public IActionResult Index()
{
    Models.Movie movie = new Models.Movie()
    {
Title = "The Godfather",
ReleaseDate = new DateTime(1972, 3, 24)
    };
    return View(movie);
}

我们做了两处修改:我们实例化了一个新的Movie对象,该对象中存储了一部世界上非常受好评的电影的信息,然后我们把该对象的实例传给View()方法。这么做会确保我们的模型在视图中是可用的。还记得我们在上一篇文章中创建的名为Index.cshtml的视图吗?是时候再次将它打开看看了。

如上文中提到的那样,视图中可以没有模型。但我们实际上想用模型,我们需要让视图意识到这点,然后告诉视图我们的模型是哪个类型的。这个过程是由Razor中的@model指令来完成的,通常写在视图文件的顶部,像这样:

@model HelloMVCWorld.Models.Movie

现在我们的视图已经知道它需要一个Movie类型的模型了,这样至少给你两点好处:1. 如果一个非Movie类型的模型被意外地传入该视图,将会报错。2. 当你在视图中使用模型的时候,Visual Studio 也能够通过 IntelliSense 功能帮助你。那么,就让我们来使用模型吧:

@model HelloMVCWorld.Models.Movie
@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>@Model.Title</title>
</head>
<body>

    The movie <b>@Model.Title</b> was released @Model.ReleaseDate.ToLongDateString()

</body>
</html>

注意我现在在HTML前端标记中多次引用Model 关键字的做法——这使我能够直接访问传入当前视图的模型,在本例中就是Movie类。这意味着我可以使用它的属性,例如Title属性和ReleaseDate属性。是时候测试一下我们的作品了——按下F5运行项目,希望你应该已经看到《教父》这部电影的信息了。

你也许也注意到,我在Model关键词的前面使用了@(at符)前缀,例如@Model.Title。这都是Razor语法的一部分,我们将在接下来的章节中探讨更多有关Razor语法的内容。

总结

祝贺你,你现在已经创建了一个完整的MVC项目,将模型、视图和控制器组合在了一起。我知道目前还有很多概念看起来都很迷惑,但我觉得,在深入学习理论知识之前,让你看到功能齐全且生动的例子是很重要的。继续阅读本系列教程,来了解这项厉害技术的更多知识!


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!