原文:Adding a controller
翻译:娄宇(Lyrics)
校对:刘怡(AlexLEWIS)何镇汐夏申斌孟帅洋(书缘)

Model-View-Controller (MVC) 架构模式将一个应用程序分离成三个主要的组件: Model、View 以及 Controller 。 MVC 模式帮助你创建可测试的应用程序,比传统的单块应用程序更加容易维护和更新。基于 MVC 的应用程序包含:

  • Models:应用程序中用来表示数据的类,并使用验证逻辑来执行该数据业务规则。通常,模型(Model)对象从数据库查询和存储 Model 状态。在本教程 Movie 模型(Model)从数据库查询电影数据用来显示或更新。更新后的数据写入 SQL Server 数据库。
  • Views:视图是显示用户界面(UI)的组件。通常,UI 用于显示模型(Model)数据。
  • Controllers:一种类(Class),用于处理浏览器请求,查询模型(Model)数据,以及将指定视图模板作为响应返回给浏览器。在 MVC 应用程序中,视图(View)仅仅显示信息; 控制器(Controller)处理和响应用户的输入和交互。例如, 控制器(Controller)处理路由数据和查询字符串值,然后将这些值传递给模型(Model),模型(Model)可以使用这些值去查询数据库。

MVC 模式帮助你创建一个分离不同方面的应用程序(输入逻辑,业务逻辑,以及 UI 逻辑),同时这些元素之间是松耦合的。该模式指定在应用程序中的每一种逻辑应该位于何处。 UI 逻辑属于视图(View)。输入逻辑属于控制器(Controller)。业务逻辑属于模型(Model)。当你构建一个应用程序时,这样的分离帮助你管理应用程序的复杂性,因为它使你编写一个方面的代码时不会影响其他(方面)的代码。比如,你可以编写视图(View)代码而不需要依赖于业务逻辑代码。

我们会在本系列教程中涵盖所有这些概念,并告诉你如何使用它们构建一个简单的电影应用程序。下面的图片展示了 MVC 项目中的 ModelsViews 以及 Controllers 文件夹。

  • 解决方案资源管理器(Solution Explorer) 中,鼠标右键点击 Controllers > 添加(Add) > 新建项...(New Item...)

添加新项(Add New Item) 对话框,输入 HelloWorldController

用下面的代码替换 Controllers/HelloWorldController.cs 中的内容:

using Microsoft.AspNetCore.Mvc;
using System.Text.Encodings.Web;

namespace MvcMovie.Controllers
{
    public class HelloWorldController : Controller
    {
        //
        // GET: /HelloWorld/

        public string Index()
        {
            return "This is my default action...";
        }

        //
        // GET: /HelloWorld/Welcome/ 

        public string Welcome()
        {
            return "This is the Welcome action method...";
        }
    }
}

控制器(Controller)的每个 public 方法都可作为 HTTP 端点。在上面的例子中,两个方法都返回 string,注意它们的注释:

public class HelloWorldController : Controller
{
    //
    // GET: /HelloWorld/  (手动高亮)

    public string Index()
    {
        return "This is my default action...";
    }

    //
    // GET: /HelloWorld/Welcome/  (手动高亮)

    public string Welcome()
    {
        return "This is the Welcome action method...";
    }
}

第一条注释指出这是一个通过在 URL 后添加 "/HelloWorld/" 调用的 HTTP GET 方法。第二条指出这是一个通过在 URL 后添加 "/HelloWorld/Welcome/" 调用的 HTTP GET 方法。之后的教程我们将使用基架引擎来生成 HTTP POST 方法。

使用非调试模式(Ctrl+F5)运行应用程序,并在浏览器地址栏路径后添加 "HelloWorld" (在下面的图片中,使用了 http://localhost:1234/HelloWorld ,但是你必须用你的应用程序端口替换 1234 )。 Index 方法返回一段字符串,系统将这段字符串转换为 HTML 返回给浏览器。

MVC 调用的控制器(Controller)类 (以及它们的 Action 方法) 取决于传入的 URL 。MVC 的默认 URL 路由逻辑 采用类似下面规则格式来决定代码的调用:

/[Controller]/[ActionName]/[Parameters]

你可以在 Startup.cs 文件中设置路由规则。

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");  //(手动高亮)
});

当你运行应用程序且不提供任何 URL 段时,它将默认访问在上面模板中高亮行指定的 "Home" Controller 中的 "Index" Action 方法。

第一个 URL 段决定运行哪个控制器(Controller)。所以 localhost:xxxx/HelloWorld 映射到 HelloWorldController 类。URL 段的第二部分决定类里的 Action 方法。所以 localhost:xxxx/HelloWorld/Index 将运行 HelloWorldController 中的 Index 方法。请注意,我们只需要浏览 localhost:xxxx/HelloWorld ,默认会调用 Index 方法。这是因为在没有指定方法名时, Index 是默认方法。URL 段的第三部分 ( id) 是路由数据。我们之后将在本教程中了解路由数据。

浏览 http://localhost:xxxx/HelloWorld/WelcomeWelcome 方法运行并返回 "This is the Welcome action method..." 。对于这个 URL , 控制器(Controller)是 HelloWorld , Action 方法是 Welcome 。我们还没有使用 URL 中的 [Parameters] 部分。

让我们稍微修改一下例子,使我们能够通过 URL 传递一些参数信息到控制器(Controller)(例如, /HelloWorld/Welcome?name=Scott&numtimes=4 )。如下所示修改 Welcome 方法使其包含两个参数。请注意,代码利用 C# 的可选参数特性指明,在没有传递参数的情况下, numTimes 参数默认为1。

public string Welcome(string name, int numTimes = 1)
{
    return HtmlEncoder.Default.Encode($"Hello {name}, id: {numTimes}");
}

警告
上面的代码使用 HtmlEncoder.Default.Encode 来保护应用程序免受恶意输入(即 JavaScript)。同时也使用了内插字符串

警告
在 Visual Studio 2015 中,当你在 IIS Express 以非调试模式 (Ctl+F5) 运行,你不需要在修改代码后生成应用程序。只需要保存文件,刷新你的浏览器就可以看到改变。

运行你的应用程序并浏览:

http://localhost:xxxx/HelloWorld/Welcome?name=Rick&numtimes=4

(用你的端口替换 xxxx。) 你可以在 URL 中对 namenumtimes 尝试不同的值。 MVC 模型绑定 系统自动将地址栏里查询字符串中有名字的参数映射到你方法中的参数。查看 模型绑定 获得更多的信息。

在上面的示例中, URL 段 (Parameters) 没有被使用, namenumTimes 参数作为 查询字符串 被传递。 上面 URL 中的 ? (问号) 是一个分隔符,后面跟查询字符串。 & 字符分割查询字符串。

用下面的代码替换 Welcome 方法:

public string Welcome(string name, int ID = 1)
{
    return HtmlEncoder.Default.Encode(
        "Hello " + name + ", ID: " + ID);
}

运行应用程序然后输入 URL : http://localhost:xxx/HelloWorld/Welcome/3?name=Rick

这次第三个 URL 段匹配上路由参数 idWelcome 方法包含一个与 MapRoute 内的 URL 模板相匹配的 id 参数。跟随的 ? (id?) 表示 id 参数是可选的。

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");  //(手动高亮)
});

在这些例子中,控制器(Controller)一直在做 MVC 中的 "VC" 部分,就是视图(View)和控制器(Controller)部分的工作。这个控制器(Controller)直接返回 HTML 。一般来说你不想让控制器(Controller) 直接返回 HTML ,因为这让编码和维护变得非常麻烦。所以,我们通常会使用一个单独的 Razor 视图模板文件来帮助生成 HTML 响应。 我们将在下一个教程中介绍这部分。

修订历史

  1. 2016/07/08,MS1;
  2. 2016/07/09,修订至 1.0.0

返回目录

ASP.NET Core 中文文档 第二章 指南(4.2)添加 Controller的更多相关文章

  1. ASP.NET Core 中文文档 第二章 指南(4.6)Controller 方法与视图

    原文:Controller methods and views 作者:Rick Anderson 翻译:谢炀(Kiler) 校对:孟帅洋(书缘) .张仁建(第二年.夏) .许登洋(Seay) .姚阿勇 ...

  2. ASP.NET Core 中文文档 第二章 指南(4.4)添加 Model

    原文:Adding a model 作者:Rick Anderson 翻译:娄宇(Lyrics) 校对:许登洋(Seay).孟帅洋(书缘).姚阿勇(Mr.Yao).夏申斌 在这一节里,你将添加一些类来 ...

  3. ASP.NET Core 中文文档 第二章 指南 (09) 使用 Swagger 生成 ASP.NET Web API 在线帮助测试文档

    原文:ASP.NET Web API Help Pages using Swagger 作者:Shayne Boyer 翻译:谢炀(kiler) 翻译:许登洋(Seay) 对于开发人员来说,构建一个消 ...

  4. ASP.NET Core 中文文档 第二章 指南(1)用 Visual Studio Code 在 macOS 上创建首个 ASP.NET Core 应用程序

    原文:Your First ASP.NET Core Application on a Mac Using Visual Studio Code 作者:Daniel Roth.Steve Smith ...

  5. ASP.NET Core 中文文档 第二章 指南(2)用 Visual Studio 和 ASP.NET Core MVC 创建首个 Web API

    原文:Building Your First Web API with ASP.NET Core MVC and Visual Studio 作者:Mike Wasson 和 Rick Anderso ...

  6. ASP.NET Core 中文文档 第二章 指南(3)用 Visual Studio 发布一个 Azure 云 Web 应用程序

    原文:Getting Started 作者:Rick Anderson 翻译:谢炀(Kiler) 校对:孟帅洋(书缘).刘怡(AlexLEWIS).何镇汐 设置开发环境 安装最新版本的 Azure S ...

  7. ASP.NET Core 中文文档 第二章 指南(4.1)ASP.NET Core MVC 与 Visual Studio 入门

    原文:Getting started with ASP.NET Core MVC and Visual Studio 作者:Rick Anderson 翻译:娄宇(Lyrics) 校对:刘怡(Alex ...

  8. ASP.NET Core 中文文档 第二章 指南(4.5)使用 SQL Server LocalDB

    原文:Working with SQL Server LocalDB 作者:Rick Anderson 翻译: 魏美娟(初见) 校对: 孟帅洋(书缘).张硕(Apple).许登洋(Seay) Appl ...

  9. ASP.NET Core 中文文档 第二章 指南(5) 在 Nano Server 上运行ASP.NET Core

    原文 ASP.NET Core on Nano Server 作者 Sourabh Shirhatti 翻译 娄宇(Lyrics) 校对 刘怡(AlexLEWIS).许登洋(Seay).谢炀(kile ...

  10. ASP.NET Core 中文文档 第二章 指南(8) 使用 dotnet watch 开发 ASP.NET Core 应用程序

    原文:Developing ASP.NET Core applications using dotnet watch 作者:Victor Hurdugaci 翻译:谢炀(Kiler) 校对:刘怡(Al ...

随机推荐

  1. ASP.NET 前后台调用方法

    Asp.Net中几种相似的标记符号: <%=...%>< %#...%>< %%>< %@ %>解释及用法 答: < %#... %>:是在 ...

  2. C# winform控件之listview学习积累

    //1.用key给ListViewItem 的 SubItems赋值 ListViewItem listViewItem= listView1.Items.Add("第一列文字") ...

  3. Android中TextView添加删除线

    项目中的需求~~~~ 商城中物品的一个本身价格,还有一个就是优惠价格...需要用到一个删除线. public class TestActivity extends Activity { private ...

  4. 如何设置session过期时间为30分钟

    今天在我的微博(Laruence)上发出一个问题: 我在面试的时候, 经常会问一个问题: “如何设置一个30分钟过期的Session?”, 大家不要觉得看似简单, 这里面包含的知识挺多, 特别适合考察 ...

  5. 1059. Prime Factors (25)

    时间限制 50 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 HE, Qinming Given any positive integer N, y ...

  6. 【转】Android 混淆代码总结

    http://blog.csdn.net/lovexjyong/article/details/24652085 为了防止自己的劳动成果被别人窃取,混淆代码能有效防止被反编译,下面来总结以下混淆代码的 ...

  7. 【POJ3208】 (DP)

    Apocalypse Someday Description The number 666 is considered to be the occult “number of the beast” a ...

  8. PL/SQL个人学习笔记(二)

    IF条件 declare cursor s is            select version from city_server t;   s_ city_server.version%type ...

  9. setTimeout 与 Event Loop 浅析

    先从一个小题目开始: 以下代码的输出结果是? function test1 () { console.log(1) }; setTimeout(test1, 1000); // T1-1setTime ...

  10. 13 Tensorflow API主要功能

    要想使用Tensorflow API,首先要知道它能干什么.Tensorflow具有Python.C++.Java.Go等多种语言API,其中Python的API是最简单和好用的. Tensor Tr ...