原文: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. JavaScript 自定义对象

    在Js中,除了Array.Date.Number等内置对象外,开发者可以通过Js代码创建自己的对象. 目录 1. 对象特性:描述对象的特性 2. 创建对象方式:对象直接量.new 构造函数.Objec ...

  2. ASP.NET MVC5+EF6+EasyUI 后台管理系统(80)-自由桌面

    系列目录 前言 这次我们来做一个有趣的事情,有朋友跟做了很远,找我要自由桌面的代码,这次我们将演示自由桌面的代码. 自由桌面:用户可以随意增删改桌面的布局.个数(只留自己需要看到的数据),这次纯属Ea ...

  3. 非关系型数据库(NoSql)

    最近了解了一点非关系型数据库,刚刚接触,觉得这是一个很好的方向,对于大数据 方面的处理,非关系型数据库能起到至关重要的地位.这里我主要是整理了一些前辈的经验,仅供参考. 关系型数据库的特点 1.关系型 ...

  4. Java 为值传递而不是引用传递

    ——reference Java is Pass by Value and Not Pass by Reference 其实这个问题是一个非常初级的问题,相关的概念初学者早已掌握,但是时间长了还是容易 ...

  5. 破解SQLServer for Linux预览版的3.5GB内存限制 (UBUNTU篇)

    在上一篇中我提到了如何破解RHEL上SQLServer的内存大小限制,但是Ubuntu上还有一道检查 这篇我将会讲解如何在3.5GB以下内存的Ubuntu中安装和运行SQLServer for Lin ...

  6. 深入解析Sqlite的完美替代者,android数据库新王者——Realm

    写在前面: 又到一年一度七夕虐狗节,看着大家忍受着各种朋友圈和QQ空间还有现实生活中的轮番轰炸,我实在不忍心再在这里给大家补刀,所以我觉得今天不虐狗,继续给大家分享有用的. 如果你比较关心androi ...

  7. 张小龙宣布微信小程序1月9日发布,并回答了大家最关心的8个问题

    2016 年 12 月 28 日,张小龙在微信公开课 PRO 版的会场上,宣布了微信小程序的正式发布时间. 微信小程序将于 2017 年 1 月 9 号正式上线. 同时他解释称,小程序就像PC时代的网 ...

  8. 什么是英特尔® Edison 模块?

    英特尔® Edison 模块 是一种 SD 卡大小的微型计算芯片,专为构建物联网 (IoT) 和可穿戴计算产品而设计. Edison 模块内含一个高速的双核处理单元.集成 Wi-Fi*.蓝牙* 低能耗 ...

  9. 使用LogMaster4Net实现应用程序日志的集中管理

    日志在软件系统中的重要性我在此也不赘述了,几乎所有程序员每天都会更日志打交道. 那么你是否曾今为这样的一些事情而困扰过: - 远程登录到不同的服务器,找到应用程序目然后查看应用日志: - 来回切换于不 ...

  10. ABP源码分析四十二:ZERO的身份认证

    ABP Zero模块通过自定义实现Asp.Net Identity完成身份认证功能, 对Asp.Net Identity做了较大幅度的扩展.同时重写了ABP核心模块中的permission功能,以实现 ...