阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

ASP.NET 5系列教程

1,713次阅读
没有评论

共计 30226 个字符,预计需要花费 76 分钟才能阅读完成。

ASP.NET 5 是用于创建 Web 应用的框架,相对于以前的版本它更加简练、灵活,本次发布的版本彻底优化了应用开发框架,你可以轻松部署应用到云端或其他平台,它包含了最小的模块化组件,所以确保你在构建复杂解决方案的同时保持灵活性。

微软已经发布了 ASP.NET 5.0,这次发布的新特性需求源于大量用户的反馈和需求,例如灵活的跨平台运行时和自主部署能力使 ASP.NET 应用不再受限于 IIS、Cloud-ready 环境配置降低了云端部署的门槛,另外源码开放无疑也是一个重量级惊喜。这些更改会有助于创建易于开发、部署、维护和现代的 Web 应用程序。相信看到以上几点作为.NET 程序员的你已经迫不及待体验 ASP.NET 5 的新功能了,下面我们就来看下这些新特性。

ASP.NET 5 是用于创建 Web 应用的框架,相对于以前的版本它更加简练、灵活,本次发布的版本彻底优化了应用开发框架,你可以轻松部署应用到云端或其他平台,它包含了最小的模块化组件,所以确保你在构建复杂解决方案的同时保持灵活性。

ASP.NET 5 包含以下特性:

·灵活的跨平台运行时

·新的 HTTP 模块请求管道

·Cloud-ready 环境配置

·统一了包含 MVC、Web API 和 Web 页面的编程模型

·无需重新编译即可查看更改效果

·并行的.NET Framework 版本

·自主部署或 IIS 部署能力

·内嵌于 Visual Studio 2015 中的新工具

·GitHub 开放源码

使用旧版本开发的应用程序不需要做任何修改,即可直接在 ASP.NET 5 上运行。然而,如需使用 ASP.NET 5 新功能,你需要将现有代码移植到新的框架。ASP.NET 5 和早期 ASP.NET 版本基本相同,因此你只需要把精力集中到新功能开发上,节省了你的代码迁移时间。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/926aac25ecc6f276f2356f1ac55f4d9b.jpg" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="wKioL1RpVNfDI0KAAABEH_SNKvA927" width="504" height="264">

以上概括性的介绍了 ASP.NET 5 的新特性和增强功能。

-menu-0'>本篇文章中我们将重点阐述以下几点:

  • 为什么重新设计 ASP.NET?

  • 灵活的跨平台运行时需求

  • 灵活的部署环境

  • 多 Framework 版本并行使用

  • 简化依赖关系管理

  • 合并 MVC、Web API 和 Web 页

  • 增强 HTTP 性能

  • Cloud-ready 部署能力

  • 集成依赖注入

  • 开源

  • 提供敏捷的开发环境

  • 关于 Web Forms

  • 早期版本 Framework 开发应用兼容性

-menu-1'>为什么重新设计 ASP.NET?

灵活的跨平台运行时需求

早期 .NET Framework 版本一直作为单一且全面的整体进行安装,每个新版本都包含了新功能和几乎所有早期功能,而鲜有删减,这就不可避免的造成 Framework 的体积的增长。这种模式确保了安装了新版 Framework 的 Windows 系统可以兼容所有早期版本的.NET 应用,但是也意味着每个应用都将运行在一个庞大冗余的框架上,即使很多功能在实际项目中没有使用。

相信每位.NET 程序员都遇到过以下尴尬的决策场景:当收到 Framework 有更新发布时的通知时,是放弃使用新增功能保持应用的灵活性还是使用新特性而忍痛让你的 Framework 更加庞大!

为了应对以上场景。ASP.NET 5 提供了三种运行时,你可以根据实际需要灵活选择:

1. 全功能 .NET CLR
全功能.NET CLR 是 Visual Studio 工程默认运行时状态。它提供所有 API,是保持应用向下兼容性最佳选择。

2. 核心 CLR (cloud-optimized runtime) -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
核心 CLR 是精简的完全模块化运行时。这个 CLR 已经被重新设计成组件便于你仅包含项目中实际使用的的.NET 特性。组件作为 NuGet 包添加。一旦完成引用,你的应用仅依赖于所需的功能。通过分解运行时为组件,我们可以更快的更改每个组件,因为每个组件都有自我更新机制。核心 CLR 只有 11M 大小,相对于 200M 的全功能 CLR 无疑将使应用更加轻便。核心 CLR 可以伴随应用一起部署并且不同的核心 CLR 可以并行运行。

3. 跨平台 CLR -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
微软将发布针对于 Linux 和 Mac OS X 发布跨平台运行时。这意味着你的.NET 应用具备了在 Mac 和 Linux 设备上运行的能力。微软将和 Mono 社区合作完成这一新特性。在发布之前,你可以使用 Mono CLR 用于跨平台开发。

新建 Visual Studio 工程默认使用全功能 .NET CLR,可以在工程属性页面更改为核心 CLR。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/290c81b303ce4c554d2a6819174dec5f.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="clip_image001" width="604" height="316">

-menu-2'>灵活的部署能力

ASP.NET 5 允许部署应用到 IIS,或脱离 IIS 进行独立部署,当设置目标 Framework 为 Core CLR 时,即可以使用部署包中的依赖项来部署应用。因此,你的应用自成一体,再不依赖于全功能的.NET 版本。该应用可以在任何设备和平台中运行应用。

这对.NET 平台开发人员无疑又是个惊喜,部署应用不在局限于 IIS,当然微软仍然推荐你使用 IIS 部署应用,但是如果需要在不兼容 IIS 的平台部署应用,你就可以使用该新特性进行操作。

后续文章中我们会发布如何创建不依赖于 IIS 的 MVC6 应用,敬请期待。

多版本 .NET 并行使用

早期版本的.NET Framework,你将时刻面临是否更新版本的选择,一方面你希望使用更新的功能,另一方面你将为旧版本开发的工程是否可以平滑迁移到新版 .NET Framework 而感到纠结。

微软在 ASP.NET 5 中改善了以上问题。在使用核心 CLR 前提下,你可以在部署包内定义依赖关系,所以你可以为每个应用程序指定.NET 版本。旧版应用可以平滑运行,同时你也可以使用新版本开发应用。因此在 ASP.NET 5 中多个版本的.NET 应用是并行的。

-menu-3'>简化依赖关系管理

ASP.NET 5 推出了一种全新的轻量级依赖关系管理机制。你不再需要在应用中添加引用,而是使用引用 NuGet 包代替。你可以通过 NuGet Package 管理器添加 NuGet 包,或者你可以编辑包含 NuGet 包列表和版本信息 JSON 文件 (project.json) 来实现引用。project.json 文件用于列举应用使用的 NuGet 相关信息,如需添加其他引用,直接在该 JSON 文件中添加即可。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/cb710c69536d2c50fe5b2980cc475311.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="clip_image002" width="604" height="366">

在 Visual Studio 2015 中,根据智能提示可以快速的添加 NuGet 包。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/804929b940a3f8dcf640d0b99cf59104.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="clip_image003" width="604" height="298">

project.json 文件仅包含直接添加到工程中的 NuGet 包。如果添加引用文件外的包,这类依赖项将仅仅被加载,而不会显示到 project.json 文件中。这种机制可以使 project.json 文件轻便易管理。

JSON 格式文件使你可以在没有安装 Visual Studio 情况下,轻松管理引用。当然,可以使用任何文本编辑器打开和编辑 project.json。

-menu-4'>合并 MVC, Web API 和 Web 页

早期版本中,MVC、Web API 和 Web 页一直在使用着不同的方式实现着相同的功能,可以说是殊途同归。例如,MVC 和 Web API 都提供了路由,但是 MVC routing 类在 System.Web.Mvc.Routing 命名空间中,而 Web API 中类似的类在 System.Web.Http.Routing 命名空间中。再举一个例子,Web 页和 MVC 都是有 Razor 语法,但是仍然包含在相同功能的不同 NuGet 包中。

在 ASP.NET 5 中,MVC、Web API 和 and Web 页将被整合到同一框架-MVC 6。这就意味着移除了重复功能模块,使开发应用变得更简单。

在预览版本中,MVC and Web API 首先被合并到 MVC 6 中。Web 页面将后在后续发布版本中添加。

增强 HTTP 性能

ASP.NET 5 提供了一个精炼快速的 HTTP 请求管道,该模块化管道允许你仅添加需要的组件,通过减轻管道开销,应用将有更好的吞吐量。

云部署能力

当你创建一个新的 ASP.NET 5 工程,这个工程默认就已经具备轻松部署到云端的结构。Visual Studio 2015 提供了全新的环境配置系统代替了 Web.config 文件。新的系统允许使用多种文件类型 (例如 JSON, XML, or 或环境变量) 存储键值对,因此你可以在任意环境中轻松指定值或获取这些值。

同时,ASP.NET 5 提供了检测和跟踪已部署云应用问题的工具。

集成依赖注入

依赖注入被内置于 ASP.NET 5 中。你可以使用 IoC 容器注册依赖项。依赖关系的注入促进了正确服务环境的提供。

-menu-5'>开源

ASP.NET 源码已经发布到 GitHub 中。不仅仅提供了当前版本源代码,微软也承诺会同步更新 GitHub 中的源码,你可以及时查看到 ASP.NET 的变化,可以下载并且提交更改到 GitHub 上。

这有助于你了解 ASP.NET 代码及技术走向,同时你可以定制自己的 ASP.NET。

提供敏捷的开发环境

Visual Studio 2015 提供了一个轻量级的 ASP.NET 开发环境。无需重新编译工程,只需要保存更改代码,就可以在浏览器中查看最新结果。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/a116aa513e54e9c5fe5f5b078c0a99ae.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="clip_image004" width="604" height="309">

你更改的代码可以在 Web 工程或者由当前 Web 工程中引用的类库中。

Visual Studio 使用 Roslyn 编译器允许动态编译。确保你拥有完整、强大的编译框架的同时,拥有趋近于解释语言的开发体验。

每个 Visual Studio 的用户界面都具有对应的脚本,因此你可以轻松在 UI 界面和脚本之间��换。

最后,可以使用其他代码编辑器编辑 ASP.NET 5 工程。

-menu-6'>关于 Web Forms

微软一直致力于提供给用户新的功能去改善开发体验,你仍旧可以开发 Web Forms 应用,并且在 Web Forms 4.6 添加了以下新特性:

  • HTTP 2

  • 异步绑定模式

  • Roslyn CodeDOM 编译器

早期版本开发的 Web Forms 应用无需任何更改可以直接在 IIS .NET 4.6 框架下运行。不过,无法使用 ASP.NET 5 核心 CLR 新特性。

例如当前有使用 Web Forms、MVC 5、Web API 2、SignalR 2、Web Pages 3 或 Entity Framework 6 开发的应用,你仅需设置当前运行时版本为全功能运行时,无需做出任何代码级别修改即可在 ASP.NET 5 中运行。但是,核心 CRL 是 ASP.NET 5 新特性,如果你希望应用具备该运行时的功能,那么需要做出一定的修改。微软提供 API Portability Analyzer 工具可以判断当前应用是否可以使用核心 CRL。这个工具还可以分析当前应用可以运行在哪些平台,以及哪些因素阻止其不能在特定平台上运行。同时也会提示所需要的更改以及使用哪些新增接口来替换。

MVC 6 和 SignalR 3 应用使用新的 HTTP 管道,所以它们无法与使用 System.Web 接口的应用兼容。如果需要升级已存在应用到 MVC 6 或者 SignalR 3,你必须使用 Visual Studio 2015 创建新工程,再导入原有工程,导入过程中需要修改不支持的代码片段。

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2016-01/127759p2.htm

本篇文章内容比较基础,主要是向大家展示如何创建一个 ASP.NET 5 工程,主要包含内容如下:

  • 创建 ASP.NET 5 工程

  • 添加 Todo 控制器

  • 安装 K Version Manager

  • 执行 EF 迁移

打开 Visual Studio 2015 Preview。选择”File” 菜单,选择New > Project

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/f1bfe10d6d53783f8d5e1ee24f60b71e.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="clip_image002" width="557" height="350">

New Project 对话框中,点击Templates > Visual C# > Web,选择ASP.NET Web Application 工程模板。命名工程为 ”TodoList”,点击OK

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/d41ce8c81c9afa108276338769969b8d.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="clip_image004" width="557" height="420">

添加 Todo 控制器

1. 下载完整工程 completed project。

2. 在工程解决方案管理器中,右键点击 Controllers 文件夹 > Add > Exiting Item 输入下载工程中的 TodoController.cs 文件路径

3. 使用相同的方法添加 Models\TodoItem.cs Models\TodoItemEditModel.cs 文件到 Models 文件夹。

4. 在 Views 下创建ToDo 文件夹。使用同样方法,添加Views\ToDo 文件夹下所有 View 文件到Views\Todo 文件夹。

5. 更改Views\Shared\_Layout.cshtml 文件下的 ActionLink 调用 Todo 控制器:

-default'><!DOCTYPE-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> html>
<html>
<head>

<meta-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> charset=-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> />
<meta-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> name=-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> content=>
<title>@ViewBag.Title-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> --default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Todo</title>

<link-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> rel=-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> href=-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> />

<link-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> rel=-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> href=-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> />

</head>

<body>

<div-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =>

<div-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =>

<div-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =>

<button-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> type=-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> data-toggle=-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> data-target=>

<span-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =></span>

<span-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =></span>

<span-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =></span>

</button>,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> area-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>},-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> @class-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>-default'></div>

<div-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =>

<ul-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =>*-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Markup-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> removed-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  brevity-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> *</body>
</html>

6. 添加 DbSet 包含 TodoItem 模型到Models\IdentityModels.cs 文件。

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  ApplicationDbContext-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> :-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> IdentityDbContext<ApplicationUser>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> _created-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  DbSet<TodoItem>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> TodoItems-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>{-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ;-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>-default'>}

7. 运行 app 点击 Todo app 链接。你会遇到以下错误信息 (将在后续文章中解决这个问题)。

A database operation failed while processing the request. -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
SqlException: Invalid object name ‘TodoItem’. -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
There are pending model changes for ApplicationDbContext -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
Scaffold a new migration for these changes and apply them to the database from the command line -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
> k ef migration add [migration name] -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
> k ef migration apply

安装 K Version Manager (KVM)

1. 以管理员身份运行 Visual Studio 命令提示工具。

2. 执行以下指令:

@powershell -NoProfile -ExecutionPolicy unrestricted -Command “iex ((new-object net.webclient).DownloadString(‘https://raw.githubusercontent.com/aspnet/Home/master/kvminstall.ps1’))”

以上指令将为当前用户安装 KVM。

3. 退出Visual Studio 命令提示工具,重新使用管理员身份运行 Visual Studio 命令提示工具(你需要使用新的命令提示工具获取已经更新的路径环境)。

4. 使用以下指令升级 KVM:

KVM upgrade -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
现在已经可以运行 EF 迁移了。.

执行 EF 迁移

1. 在管理员命令提示窗体中,更改当前操作路径为工程文件夹,工程文件夹下包含 project.json 文件。

2. 在命令提示窗体中运行以下指令:

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

k ef migration add initial -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
k ef migration apply -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
ef migration add initial

指令将以 <date>_<migration name>.cs 命名形式添加一个迁移文件,迁移文件中包含了迁移代码 that adds the TodoItem DbSet. TheMigrations\ApplicationDbContextModelSnapshot.cs 文件 file will be updated to include instructions to create theTodoItem entity.

-default'>builder.Entity(,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> b-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =><>(<>(<>(<>(

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/f73372f88ebfe0b8475fef77cfed9496.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="clip_image006" width="289" height="462">

· 运行应用,点击 Todo app 链接。点击Create New Todo 链接创建一个新的 Todo 项。ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/10c64668202702028375cc521a523f3a.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="clip_image008" width="368" height="366">

关于 Todo 控制器

Todo 控制器类似于创建了一个带有异常的 ASP.NET MVC 5 工程。在这个示例中,数据内容被注入到Todo 控制器. 你可以从链接中了解更多信息:Dependency Injection in ASP.NET vNext。

以上步骤创建了一个新的 ASP.NET 5.0 工程,在下一篇文章中我们将讲述 View Components 的使用方法。敬请期待.

原文地址:View components and Inject in ASP.NET MVC 6

ASP.NET 5 是用于创建 Web 应用的框架,相对于以前的版本它更加简练、灵活,本次发布的版本彻底优化了应用开发框架,你可以轻松部署应用到云端或其他平台,它包含了最小的模块化组件,所以确保你在构建复杂解决方案的同时保持灵活性。

微软已经发布了 ASP.NET 5.0,这次发布的新特性需求源于大量用户的反馈和需求,例如灵活的跨平台运行时和自主部署能力使 ASP.NET 应用不再受限于 IIS、Cloud-ready 环境配置降低了云端部署的门槛,另外源码开放无疑也是一个重量级惊喜。这些更改会有助于创建易于开发、部署、维护和现代的 Web 应用程序。相信看到以上几点作为.NET 程序员的你已经迫不及待体验 ASP.NET 5 的新功能了,下面我们就来看下这些新特性。

ASP.NET 5 是用于创建 Web 应用的框架,相对于以前的版本它更加简练、灵活,本次发布的版本彻底优化了应用开发框架,你可以轻松部署应用到云端或其他平台,它包含了最小的模块化组件,所以确保你在构建复杂解决方案的同时保持灵活性。

ASP.NET 5 包含以下特性:

·灵活的跨平台运行时

·新的 HTTP 模块请求管道

·Cloud-ready 环境配置

·统一了包含 MVC、Web API 和 Web 页面的编程模型

·无需重新编译即可查看更改效果

·并行的.NET Framework 版本

·自主部署或 IIS 部署能力

·内嵌于 Visual Studio 2015 中的新工具

·GitHub 开放源码

使用旧版本开发的应用程序不需要做任何修改,即可直接在 ASP.NET 5 上运行。然而,如需使用 ASP.NET 5 新功能,你需要将现有代码移植到新的框架。ASP.NET 5 和早期 ASP.NET 版本基本相同,因此你只需要把精力集中到新功能开发上,节省了你的代码迁移时间。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/926aac25ecc6f276f2356f1ac55f4d9b.jpg" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="wKioL1RpVNfDI0KAAABEH_SNKvA927" width="504" height="264">

以上概括性的介绍了 ASP.NET 5 的新特性和增强功能。

-menu-7'>本篇文章中我们将重点阐述以下几点:

  • 为什么重新设计 ASP.NET?

  • 灵活的跨平台运行时需求

  • 灵活的部署环境

  • 多 Framework 版本并行使用

  • 简化依赖关系管理

  • 合并 MVC、Web API 和 Web 页

  • 增强 HTTP 性能

  • Cloud-ready 部署能力

  • 集成依赖注入

  • 开源

  • 提供敏捷的开发环境

  • 关于 Web Forms

  • 早期版本 Framework 开发应用兼容性

-menu-8'>为什么重新设计 ASP.NET?

灵活的跨平台运行时需求

早期 .NET Framework 版本一直作为单一且全面的整体进行安装,每个新版本都包含了新功能和几乎所有早期功能,而鲜有删减,这就不可避免的造成 Framework 的体积的增长。这种模式确保了安装了新版 Framework 的 Windows 系统可以兼容所有早期版本的.NET 应用,但是也意味着每个应用都将运行在一个庞大冗余的框架上,即使很多功能在实际项目中没有使用。

相信每位.NET 程序员都遇到过以下尴尬的决策场景:当收到 Framework 有更新发布时的通知时,是放弃使用新增功能保持应用的灵活性还是使用新特性而忍痛让你的 Framework 更加庞大!

为了应对以上场景。ASP.NET 5 提供了三种运行时,你可以根据实际需要灵活选择:

1. 全功能 .NET CLR
全功能.NET CLR 是 Visual Studio 工程默认运行时状态。它提供所有 API,是保持应用向下兼容性最佳选择。

2. 核心 CLR (cloud-optimized runtime) -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
核心 CLR 是精简的完全模块化运行时。这个 CLR 已经被重新设计成组件便于你仅包含项目中实际使用的的.NET 特性。组件作为 NuGet 包添加。一旦完成引用,你的应用仅依赖于所需的功能。通过分解运行时为组件,我们可以更快的更改每个组件,因为每个组件都有自我更新机制。核心 CLR 只有 11M 大小,相对于 200M 的全功能 CLR 无疑将使应用更加轻便。核心 CLR 可以伴随应用一起部署并且不同的核心 CLR 可以并行运行。

3. 跨平台 CLR -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
微软将发布针对于 Linux 和 Mac OS X 发布跨平台运行时。这意味着你的.NET 应用具备了在 Mac 和 Linux 设备上运行的能力。微软将和 Mono 社区合作完成这一新特性。在发布之前,你可以使用 Mono CLR 用于跨平台开发。

新建 Visual Studio 工程默认使用全功能 .NET CLR,可以在工程属性页面更改为核心 CLR。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/290c81b303ce4c554d2a6819174dec5f.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="clip_image001" width="604" height="316">

-menu-9'>灵活的部署能力

ASP.NET 5 允许部署应用到 IIS,或脱离 IIS 进行独立部署,当设置目标 Framework 为 Core CLR 时,即可以使用部署包中的依赖项来部署应用。因此,你的应用自成一体,再不依赖于全功能的.NET 版本。该应用可以在任何设备和平台中运行应用。

这对.NET 平台开发人员无疑又是个惊喜,部署应用不在局限于 IIS,当然微软仍然推荐你使用 IIS 部署应用,但是如果需要在不兼容 IIS 的平台部署应用,你就可以使用该新特性进行操作。

后续文章中我们会发布如何创建不依赖于 IIS 的 MVC6 应用,敬请期待。

多版本 .NET 并行使用

早期版本的.NET Framework,你将时刻面临是否更新版本的选择,一方面你希望使用更新的功能,另一方面你将为旧版本开发的工程是否可以平滑迁移到新版 .NET Framework 而感到纠结。

微软在 ASP.NET 5 中改善了以上问题。在使用核心 CLR 前提下,你可以在部署包内定义依赖关系,所以你可以为每个应用程序指定.NET 版本。旧版应用可以平滑运行,同时你也可以使用新版本开发应用。因此在 ASP.NET 5 中多个版本的.NET 应用是并行的。

-menu-10'>简化依赖关系管理

ASP.NET 5 推出了一种全新的轻量级依赖关系管理机制。你不再需要在应用中添加引用,而是使用引用 NuGet 包代替。你可以通过 NuGet Package 管理器添加 NuGet 包,或者你可以编辑包含 NuGet 包列表和版本信息 JSON 文件 (project.json) 来实现引用。project.json 文件用于列举应用使用的 NuGet 相关信息,如需添加其他引用,直接在该 JSON 文件中添加即可。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/cb710c69536d2c50fe5b2980cc475311.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="clip_image002" width="604" height="366">

在 Visual Studio 2015 中,根据智能提示可以快速的添加 NuGet 包。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/804929b940a3f8dcf640d0b99cf59104.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="clip_image003" width="604" height="298">

project.json 文件仅包含直接添加到工程中的 NuGet 包。如果添加引用文件外的包,这类依赖项将仅仅被加载,而不会显示到 project.json 文件中。这种机制可以使 project.json 文件轻便易管理。

JSON 格式文件使你可以在没有安装 Visual Studio 情况下,轻松管理引用。当然,可以使用任何文本编辑器打开和编辑 project.json。

-menu-11'>合并 MVC, Web API 和 Web 页

早期版本中,MVC、Web API 和 Web 页一直在使用着不同的方式实现着相同的功能,可以说是殊途同归。例如,MVC 和 Web API 都提供了路由,但是 MVC routing 类在 System.Web.Mvc.Routing 命名空间中,而 Web API 中类似的类在 System.Web.Http.Routing 命名空间中。再举一个例子,Web 页和 MVC 都是有 Razor 语法,但是仍然包含在相同功能的不同 NuGet 包中。

在 ASP.NET 5 中,MVC、Web API 和 and Web 页将被整合到同一框架-MVC 6。这就意味着移除了重复功能模块,使开发应用变得更简单。

在预览版本中,MVC and Web API 首先被合并到 MVC 6 中。Web 页面将后在后续发布版本中添加。

增强 HTTP 性能

ASP.NET 5 提供了一个精炼快速的 HTTP 请求管道,该模块化管道允许你仅添加需要的组件,通过减轻管道开销,应用将有更好的吞吐量。

云部署能力

当你创建一个新的 ASP.NET 5 工程,这个工程默认就已经具备轻松部署到云端的结构。Visual Studio 2015 提供了全新的环境配置系统代替了 Web.config 文件。新的系统允许使用多种文件类型 (例如 JSON, XML, or 或环境变量) 存储键值对,因此你可以在任意环境中轻松指定值或获取这些值。

同时,ASP.NET 5 提供了检测和跟踪已部署云应用问题的工具。

集成依赖注入

依赖注入被内置于 ASP.NET 5 中。你可以使用 IoC 容器注册依赖项。依赖关系的注入促进了正确服务环境的提供。

-menu-12'>开源

ASP.NET 源码已经发布到 GitHub 中。不仅仅提供了当前版本源代码,微软也承诺会同步更新 GitHub 中的源码,你可以及时查看到 ASP.NET 的变化,可以下载并且提交更改到 GitHub 上。

这有助于你了解 ASP.NET 代码及技术走向,同时你可以定制自己的 ASP.NET。

提供敏捷的开发环境

Visual Studio 2015 提供了一个轻量级的 ASP.NET 开发环境。无需重新编译工程,只需要保存更改代码,就可以在浏览器中查看最新结果。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/a116aa513e54e9c5fe5f5b078c0a99ae.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="clip_image004" width="604" height="309">

你更改的代码可以在 Web 工程或者由当前 Web 工程中引用的类库中。

Visual Studio 使用 Roslyn 编译器允许动态编译。确保你拥有完整、强大的编译框架的同时,拥有趋近于解释语言的开发体验。

每个 Visual Studio 的用户界面都具有对应的脚本,因此你可以轻松在 UI 界面和脚本之间��换。

最后,可以使用其他代码编辑器编辑 ASP.NET 5 工程。

-menu-13'>关于 Web Forms

微软一直致力于提供给用户新的功能去改善开发体验,你仍旧可以开发 Web Forms 应用,并且在 Web Forms 4.6 添加了以下新特性:

  • HTTP 2

  • 异步绑定模式

  • Roslyn CodeDOM 编译器

早期版本开发的 Web Forms 应用无需任何更改可以直接在 IIS .NET 4.6 框架下运行。不过,无法使用 ASP.NET 5 核心 CLR 新特性。

例如当前有使用 Web Forms、MVC 5、Web API 2、SignalR 2、Web Pages 3 或 Entity Framework 6 开发的应用,你仅需设置当前运行时版本为全功能运行时,无需做出任何代码级别修改即可在 ASP.NET 5 中运行。但是,核心 CRL 是 ASP.NET 5 新特性,如果你希望应用具备该运行时的功能,那么需要做出一定的修改。微软提供 API Portability Analyzer 工具可以判断当前应用是否可以使用核心 CRL。这个工具还可以分析当前应用可以运行在哪些平台,以及哪些因素阻止其不能在特定平台上运行。同时也会提示所需要的更改以及使用哪些新增接口来替换。

MVC 6 和 SignalR 3 应用使用新的 HTTP 管道,所以它们无法与使用 System.Web 接口的应用兼容。如果需要升级已存在应用到 MVC 6 或者 SignalR 3,你必须使用 Visual Studio 2015 创建新工程,再导入原有工程,导入过程中需要修改不支持的代码片段。

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2016-01/127759p2.htm

在 ASP.NET MVC 6 中,view components (VCs) 功能类似于虚拟视图,但是功能更加强大。VCs 兼顾了视图和控制器的优点,你可以把 VCs 看作一个 Mini 控制器。它负责控制应用中的某一功能模块,例如:

  • 动态导航菜单

  • 标签云

  • 登录面板

  • 购物车

  • 最近文章

  • 博客侧边栏

假如使用 VC 创建了登录面板,可以在很多场景中调用,例如:

  • 用户没有登录

  • 用户已登录,需要退出使用其他帐号登录或者管理其他帐号。

  • 如果当前登录角色为管理员,渲染管理员登录面板

你可以根据用户的需求获取数据进行渲染。添加 VC 到需要该视图控件的页面。

VC 包含两部分,类 (一般继承于 ViewComponent) 和调用 VC 类中方法的 Razor 视图。类似于 ASP.NET 控制器, VC 可以作为 POCO 使用,但是更多用户倾向于使用从 VewComponent 中继承而来的方法和属性。

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

VC 的创建方式有:

  • 继承 ViewComponent.

  • 拥有 [ViewComponent] 属性,或者从拥有 [ViewComponent]属性派生的类。

  • 创建名称已 ViewComponent 为后缀的类。

和 controllers 相同,VCs 必须是公开、非嵌套和非抽象的类。

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-menu-14'>添加 view component 类

1. 创建名为 ViewComponents 的文件夹,View component 类可以包含在工程中的任何文件夹下。

2. 在ViewComponents 文件夹下创建PriorityListViewComponent.cs 类。.

3. 使用以下代码替代PriorityListViewComponent.cs 文件原有代码:

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> IViewComponentResult-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Invoke(-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> items-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> db.TodoItems.Where(x-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> x.IsDone-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ==-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  &&<=

代码注释:

· 因为 PriorityListViewComponent 类继承于ViewComponent,运行时将通过字符串 ”PriorityList” 从 View 中引用该类。在后续章节将会进行详细阐述。

· [ViewComponent] 属性用于设置引用 VC 的别名,例如,创建名称为 XYZ 的类,我们可以通过以下代码设置其引用别名:

-default'>[ViewComponent(Name-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> XYZ-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> :-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ViewComponent

· 组件使用构造注入器使数据内容生效,类似于 Todo 控制器的功能。

· 调用 View 中的公开方法,可以传递任意数量的参数。在异步版本中,InvokeAsync 是可用的。在后续章节中我们将提及 InvokeAsync 和多参数的使用方法。在之前的代码中,公开方法的返回值为代办事项(ToDoItems),优先级不低于 maxPriority。

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-menu-15'>添加视图控件

1. 在 Views\Todo 文件夹下创建Components 文件夹,注意这个文件夹需要命名为 Components。

2. 在 Views\Todo\Components 文件夹下创建PriorityList 文件夹。文件夹名称必须和 view component 类名称一致。或者类名去除后缀名称(如果在创建类时遵循惯例使用 ViewComponent 作为后缀)。如果使用了 ViewComponent 属性。

3. Views\Todo\Components\PriorityList-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  文件夹下创建Default.cshtml Razor 视图,添加以下标记:

-default'>-default'>@model-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> IEnumerable<TodoList.Models.TodoItem>

<h3>Priority-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Items</h3>
<ul>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> todo-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> <li>@todo.Title</li></ul>

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

Razor 视图包含并且显示了 TodoItems。如果 VC 调用方法没有传递视图的名称 (如例子中所示),那么默认情况下则调用视图名称对于方法。在后续的文章中,将阐述如何传递视图名称。

views\todo\index.cshtml 视图底部添加包含有调用 PriorityListViewComponent 的 div:

-default'>-default'>@model-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> IEnumerable<TodoList.Models.TodoItem>

<h3>Priority-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Items</h3>
<ul>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> todo-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> <li>@todo.Title</li></ul>

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

标记 @await Component.InvokeAsync() 表示该语法用于调用 VC。第一个参数是我们要调用的组件名称。其余参数参数传递给该 VC。在这个例子中,我们传递“1”作为过滤的优先级。InvokeAsync 方法可以包含任意数量的参数。

以下图片显示了优先级列表:

-default'>=-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> <div-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  <h1>ASP.NET-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> vNext</h1>
-default'>-default'>-default'></div>

<div-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  <div-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =>==-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> <h4>No-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Todo-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Items</h4><table>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  <tr><th>TODO</th><th></th></tr>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> todo-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> <tr>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  <td>@todo.Title-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> </td>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  <td>,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> id-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> todo.Id-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>-default'>})-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> |,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> id-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> todo.Id-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>-default'>})-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> |,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> id-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =</td>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  </tr></table><div>@Html.ActionLink(,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> )-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>-default'></div>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'></div>

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  <div-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =>,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>-default'></div>

-default'>-default'>-default'></div>

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/c6c74767641fc4b83f9db77d7a8ee76b.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="432" height="494">

注意:VC 通常被添加到 Views\Shared 文件夹下,因为它并不仅仅是 controller。

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-menu-16'>添加 InvokeAsync 到优先级组件

通过以下代码更新 PriorityListViewComponent 类:

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  =
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  Task<IViewComponentResult>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> InvokeAsync(-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> maxPriority,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  MyView-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> (maxPriority-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> >-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  &&-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> isDone-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ==-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  items-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  Task<IQueryable<TodoItem>>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> GetItemsAsync(-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> maxPriority,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  IQueryable<TodoItem>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> GetItems(-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> maxPriority,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  items-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> db.TodoItems.Where(x-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> x.IsDone-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ==-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> isDone-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> &&<=-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> msg-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  +-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> maxPriority.ToString()-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> +-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  +=

注意: 这里移除了用于同步的 Invoke 方法,使用更加强大的 asynchronous 方法替代。

修改 VC 视图显示优先级信息:

-default'>@model-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> IEnumerable<TodoList.Models.TodoItem>

<h4>@ViewBag.PriorityMessage</h4>
<ul>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> todo-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> <li>@todo.Title</li></ul>

最后,更新 views\todo\index.cshtml 视图文件:

-default'>@*-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Markup-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> removed-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  brevity.-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> *<div-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =>,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>-default'></div>
-default'>-default'>-default'></div>

以下图片展示了 PriorityListViewComponent 类和 Index 视图的修改效果:

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/e6ade510f5dd0677e261ad306d971116.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="416" height="526">

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-menu-17'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-menu-18'>指定视图名称

一些复杂的 VC 在某些情况下也许需要去指定特定的视图,以下代码是通过 InvokeAsync 方法指定视图的方法:

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  Task<IViewComponentResult>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> InvokeAsync(-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> maxPriority,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  MyView-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> (maxPriority-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> >-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  &&-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> isDone-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ==-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  items-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

更改 Views\Todo\Components\PriorityList\Default.cshtml Views\Todo\Components\PriorityList\PVC.cshtml 视图。更改 PVC 视图控件来验证它的使用:

-default'>@model-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> IEnumerable<TodoList.Models.TodoItem>

<h2>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> PVC-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Named-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Priority-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Component-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> View</h2>
<h4>@ViewBag.PriorityMessage</h4>
<ul>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> todo-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> <li>@todo.Title</li></ul>

最后,需要更新 Views\Todo\Index.cshtml 文件:

刷新页面查看更改效果。

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

在 MVC6 中,更改 controller(或其他任何代码)时,不需要重新编译或重新运行应用,仅需要保存代码并且刷新页面即可。

以上即为今天希望和大家分享的 view components 知识,下一篇文章我们将介绍以下两部分内容:

  • 向视图中添加 服务方法。

  • 发布应用到 公有云 方法。

敬请期待。

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

原文链接:http://www.asp.net/vnext/overview/aspnet-vnext/vc

-menu-19'>向视图中添加服务

现在,ASP.NET MVC 6 支持注入类到视图中,和 VC 类不同的是,对类是公开的、非嵌套或非抽象并没有限制。在这个例子中,我们创建了一个简单的类,用于统计代办事件、已完成事件和平均优先级的服务。

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-menu-20'>1. 添加命名为 Services 的文件夹,在该文件夹下添加名称为 StatisticsService.cs 的类:

StatisticsService 类代码设计如下:

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> System.Linq;
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> System.Threading.Tasks;
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> TodoList.Models;
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> TodoList.Services
-default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  StatisticsService
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  ApplicationDbContext-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> db;
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> StatisticsService(ApplicationDbContext-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> context)
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  db-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> context;
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> async-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Task<int>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> GetCount()
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> await-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Task.FromResult(db.TodoItems.Count());
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> async-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Task<int>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> GetCompletedCount()
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> await-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Task.FromResult(
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  db.TodoItems.Count(x-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> x.IsDone-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ==-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ));
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> async-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Task<>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> GetAveragePriority()
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> await-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Task.FromResult(
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  db.TodoItems.Average(x-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> (?)x.Priority)-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ??-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 0.0);
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
-default'>-default'>-default'>}

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-menu-21'>2. 更新 Index 视图注入代办事项数据,在文件顶部添加以下代码声明注入的服务:

@inject TodoList.Services.StatisticsService Statistics

添加标记调用 StatisticsService:

<div>@Html.ActionLink("",-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "",-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "")-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>-default'></div>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'></div>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  <div-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ="">
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  @await-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Component.InvokeAsync("",-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 4,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> )
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  <h3>Stats</h3>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  <ul>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  <li>Items:-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> @await-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Statistics.GetCount()</li>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  <li>Completed:@await-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Statistics.GetCompletedCount()</li>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  <li>Average-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Priority:@await-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Statistics.GetAveragePriority()</li>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  </ul>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'></div>
-default'>-default'>-default'></div>

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

以下是该文件的完整代码:

@inject-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> TodoList.Services.StatisticsService-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Statistics
@-default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  ViewBag.Title-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "";
-default'>-default'>-default'>}
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
<div-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ="">
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  <h1>ASP.NET-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> vNext</h1>
-default'>-default'>-default'></div>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
<div-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ="">
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  <div-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ="">
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  @-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> (Model.Count-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ==-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 0)
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  <h4>No-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Todo-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Items</h4>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
-default'>else
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  <table>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  <tr><th>TODO</th><th></th></tr>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  @foreach-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> (var-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> todo-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  Model)
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  <tr>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  <td>@todo.Title-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> </td>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  <td>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  @Html.ActionLink("",-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "",-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "",-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> id-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> todo.Id-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>-default'>})-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> |
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  @Html.ActionLink("",-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "",-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "",-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> id-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> todo.Id-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>-default'>})-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> |
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  @Html.ActionLink("",-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "",-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "",-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> id-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> todo.Id-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>-default'>})
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  </td>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  </tr>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  </table>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  <div>@Html.ActionLink("",-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "",-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "")-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>-default'></div>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'></div>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  <div-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ="">
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  @await-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Component.InvokeAsync("",-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 4,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> )
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  <h3>Stats</h3>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  <ul>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  <li>Items:-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> @await-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Statistics.GetCount()</li>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  <li>Completed:@await-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Statistics.GetCompletedCount()</li>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  <li>Average-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Priority:@await-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Statistics.GetAveragePriority()</li>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  </ul>
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'></div>
-default'>-default'>-default'></div>

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-menu-22'>3. 在 Startup.cs 文件中注册 StatisticsService 类:

//-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> This-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> method-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> gets-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> called-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> by-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> the-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> runtime.
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> void-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ConfigureServices(IServiceCollection-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> services)
-default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  //-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Add-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> EF-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> services-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  the-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> services-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> container.
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  services.AddEntityFramework(Configuration)
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  .AddSqlServer()
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  .AddDbContext<ApplicationDbContext>();
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  //-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Add-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Identity-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> services-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  the-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> services-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> container.
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  services.AddDefaultIdentity<ApplicationDbContext,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ApplicationUser,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> IdentityRole>(Configuration);
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  //-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Add-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> MVC-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> services-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  the-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> services-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> container.
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  services.AddMvc();
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  services.AddTransient<TodoList.Services.StatisticsService>();
-default'>-default'>-default'>}

以下是效果图:

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/d38112ca0e0bfbdd002746f6d88c0cd8.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="376" height="604">

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-menu-23'>发布应用到 公有

发布应用到公有云,你需要申请 Microsoft Azure 帐号,如果没有,可以通过以下链接注册:activate your MSDN subscriber benefits 或 sign up for a free trial.

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-menu-24'>1. 右键点击 TodoList 工程 > 发布

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/7401762bcf4853e4590d40f5c41f806c.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="398" height="419">

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-menu-25'>2. 在发布对话框中,点击 Microsoft Azure Websites 并登陆公有云帐号。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/a012bba3d608bd4f3b33d9615e20ffb8.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="609" height="481">

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-menu-26'>3. 点击 New。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/fb4b0d27531f5c933abb56a38f1d8492.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="555" height="330">

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-menu-27'>4. 输入 site name 和 region。如果你之前没有创建过数据服务器,需要新建,否则可以使用原有的数据库服务器。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/5971a8edd00a1cf16612e8a51880a4de.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="610" height="492">
数据库服务器是一个宝贵的资源。最好使用现有服务器进行测试和开发。然而由于没有密码校验机制,密码输入错误时不会有错误提示,只有在应用实际访问数据库时才会报错。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/172a9a759df2798e8f3171cbe9932681.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="610" height="466">

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-menu-28'>5. 在Connection 标签中点击 > Next。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/d23c84beda95a1130e1a851191bbcacf.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="610" height="479">

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-menu-29'>6. 在Settings 标签中,选择 KRE 版本。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/c20b9485f38b2cfe06346a1da88106fd.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="610" height="479">

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-menu-30'>7. 点击 Publish。

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-menu-31'>8. 好了,至此你的应用就发布到公有云了,以下是效果图。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/88e7c9b5dc273616147bb1e512974e7a.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="553" height="650">

原文链接:http://www.asp.net/vnext/overview/aspnet-vnext/vc#inj

基于 Visual Studio 2015,你可以:

  • 方便的管理前端包,如 jQuery, Bootstrap, 或 Angular。

  • 自动运行任务,如 LESS、JavaScript 压缩、JSLint、JavaScript 单元测试等。

  • 方便的获得 Web 开发者生态圈的工具包。

为了实现这些场景,Visual Studio 2015 已经内置了一些流行的第三方工具包:

  • Bower:Web 包管理器,Bower 可以帮你安装前端包,包括 JavaScript、CSS 类库。对于服务器端包,请通过 NuGet 包管理。

  • Grunt and Gulp:Grunt 和 Gulp 是基于 JavaScript 的运行任务。如你未用过类似功能,可以认为这是一个自动调度运行的 app,ASP.NET 5 工程模板使用的是 Grunt 运行任务。

  • npm (Node Package Manager). npm 是一个 node 包管理器,最初被用于 Node.js 包管理。上面说的 Bower、Grunt、Gulp 用到了 npm。

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

启动 Visual Studio 2015,新建一个 ASP.NET 5.0 的工程,选择文件-> 新建工程->Visual C#->Web->ASP.NET Web 应用程序:

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/fdacce18b4b1c69fdd950763870be44d.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="675" height="381">

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

在新建工程对话框,选择 ASP.NET 5.0 Starter Web

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/8b5a2e97d40a2cd268e6f25b62a94eca.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="679" height="507">

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

创建一个 ASP.NET MVC 6 app,工程文件结构如下:

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/16d3a8c901d053df3819a93b9496884a.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="307" height="430">

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

该工程下,包括如下重要的配置文件:

  • Project.json. 主工程文件,NuGet 包依赖清单.

  • package.json. npm 包清单.

  • bower.json. Bower 包清单.

  • gruntfile.js. 配置 Grunt 任务.

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-menu-32'>静态文件和 wwwroot

wwwroot 文件夹在 ASP.NET 5.0 中是新增的,工程中所有的静态文件存放于此。且客户端可直接访问这些文件,包括 HTML 文件、CSS 文件、Images 文件、JavaScript 文件。wwwroot 文件夹是网站的根目录,如这个域名 http://hostname/ 指向 wwwroot 文件夹。

代码应该存放在 wwwroot 外,包括 C# 文件、Razor 文件,既 wwwroot 文件夹用于实现代码文件、静态文件的隔离。

  • 编译 CoffeeScript or TypeScript 文件为 JavaScript.

  • 编译 LESS or Sass 文件为 CSS.

  • 压缩 JavaScript.

  • 优化 image 文件.

以上的操作会把 wwwroot 文件夹外的代码文件进行编译,然后拷贝到 wwwroot 文件夹下,这样前端即可访问。可通过任务调度自动执行这些步骤。

"webroot":-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "wwwroot""version":-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "1.0.0-*"-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>-default'>}

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-menu-33'>使用 Bower 来进行前端包管理

下面我们看看如何在 Visual Studio 2015 中使用 Bower 进行前端包管理,在本节中,我们天津 RequireJs 类库给 app。

打开 bower.json,在 dependencies 节添加 requirejs 入口。

"dependencies""bootstrap":-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "~3.0.0""jquery":-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "~1.10.2""jquery-validation":-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "~1.11.1""jquery-validation-unobtrusive":-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "~3.2.2""requirejs":-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "^2.1"

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

备注:bower 版本语法模式是”major.minor.patch”. 在 ^2.1 中,字符 ’^’指定最小版本号。’~1.10.2′ 用于指定最小为 1.10.2 版本,或者任何 1.10 的最新补丁。更多细节,请查看 Github:https://github.com/npm/node-semver.

在 Visual Studio 2015 下,可使用智能感知获得可用包的列表:

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/91091a20292b862987eb598e18f59921.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="469" height="305">

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

也可以获得包版本号的智能提示

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/1e6f4bb0ee71df537279c1f98416ad11.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="616" height="261">

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

现在安装最新包,在解决方案视图,点击 Dependencies,然后在Bower 文件夹上右击单击Restore Packages.

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/8e9db2eb5b2d058642ba29eee4787d6a.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="429" height="340">

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

可通过 Output 窗体查看安装的细节。包被安装到 bower_components 文件夹。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/1cff2d2b93044ba4b20898de9542b008.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="669" height="239">

Visual Studio 会自动加载对应版本的包在您的解决方案中。这样包文件就不用上传到源码管理下。

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-menu-34'>使用 Grunt 运行任务调度

使用 gruntfile.js 文件来定义 Grunt 任务,默认的工程模板包括了这样的任务,如 Bower 包管理器。

下面我们使用 Grunt 来添加 LESS 处理、编译过程。

在工程下,创建一个文件夹 assets。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/88041bc7d5e6e812b4a640332434ddcb.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="376" height="332">

在 assets 文件夹上右键,选择Add > New Item. 在新建项对话框中,选择 LESS Style Sheet 文件,命名为“site.less”.

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/0b495f39f778d6e42ff739fb716e3fdb.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="679" height="414">

粘贴如下代码到 site.less 文件

-

使用 @base 变量用于定义颜色值,这个变量被用于 LESS 的特性。

  • 安装 task,创建一个 Grunt task 或者复用一个存在的.

  • 在 Grunt 文件中配置 task.

  • 绑定 task 到 Visual Studio 编译任务中

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

在 package.json 文件中,配置 grunt-contrib 库。

"version":-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "0.0.0""name":-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "MyApp""devDependencies""grunt":-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "^0.4.5""grunt-bower-task":-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "^0.4.0"
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  "grunt-contrib-less":-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "^0.12.0"

在输入的时候,同样会看到可用包列表:

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/cbbf330988474b7015b9f689c80b85c3.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="417" height="319">

同样可智能感知出版本号:

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/d76102b294c8712e318216a5d76a201e.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="453" height="317">

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

在解决方案,点击Dependencies > NPM,你可以看到grunt-contrib-less 已经被列出来,但是目前尚未安装。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/dab65057bf4b0eb9e6725b47cb252b58.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="400" height="327">

点击右键,Restore Packages。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/3b3943ffe2dac8b08642674ab8636074.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="422" height="474">

安装完成的 gruntfile.js 文件如下所示:

module.exports-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "wwwroot/lib""byComponent""Assets""wwwroot/css/site.css":-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "assets/site.less""default",-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ["bower:install""grunt-bower-task"-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  grunt.loadNpmTasks("grunt-contrib-less"

initConfig 方法

使用 initConfig 方法来配置 Grunt 任务。每个 Grunt 插件有他自己的配置项集合。如,我们可以配置 grunt-contrib-less 编译为 assets/site.less 文件,然后拷贝到 wwwroot/css/site.css.

loadNpmTasks 方法

从 Grunt 插件中加载任务,工程模板默认通过这个来加载 grunt-bower-task。下面添加一个grunt-contrib-less。

在解决方案视图,选择 gruntfile.js-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  右键Task Runner Explorer

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/1c6030f484f1b4709c572ca752b60d86.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="430" height="509">

通过选择任务名称“less”,点击 Run 运行:

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/a8e02110deeef4c23c87f3accd604459.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="414" height="282">

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

output 窗口运行如下:

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/939625e75eb9c94327d29ce993e039ab.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="677" height="214">

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

打开 /wwwroot/css/site.css 文件,可看到编译后的 CSS 文件如下:

-color:-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> #008080

运行程序,背景色已经被真实颜色修改了:

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/3692b84455cdc66f5d43ed1d27d58e1a.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="677" height="344">

配置自动运行:通过Bindings > After Build 即可配置自动运行。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/c09bec35bd1f30fc95e5cd9ed65f386a.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="472" height="374">

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

原文链接:Manage Client-Side Web Development in Visual Studio 2015, Using Grunt and Bower

ASP.NET 5.0 的主要目标之一是统一 MVC 和 Web API 框架应用。

接下来几篇文章中您会了解以下内容:

  • ASP.NET MVC 6 中创建简单的 web API。

  • 如何从空的项目模板中启动,及添加控件到应用中。

  • 如何配置 ASP.NET 5.0 管道。

  • 在 IIS 外对立部署应用。

本文的目的是从空的项目开始,逐步讲解如何创建应用。当然,您也可以从“Starter Web”模板开始,它默认包含了 MVC 6、权限、记录等其他模块,同时也内置了有效的控制器和视图在其中。

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-menu-35'>创建空的 ASP.NET 5 项目

打开 Visual Studio 2015。点击 File 菜单,选择 New > Project。

New Project 对话框中,点击 Templates > Visual C# > Web,选择 ASP.NET Web Application 项目模板。命名为 “TodoApi”,点击 OK。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/4f0c85fa41a6dff46a29ab6c3cf7734a.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt=""width="600"height="360">

New ASP.NET Project 对话框中,选择 “ASP.NET 5.0 Empty” 模板。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/a68112049949a0836db10d2a106c8ba8.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt=""width="600"height="448">

下面的效果图展示了工程结构:

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/bbb1c8cad296f026e94bc31ae94caee1.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="">

工程包含以下文件:

  • global.json 包含了解决方案级别的设置,允许工程到工程之间的引用。

  • project.json 包含了工程级别的设置。

  • Project_Readme.html-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  为 readme 文件。

  • Startup.cs 包含启动和配置代码。

Startup.cs 文件中的Startup 类,配置了 ASP.NET 需求管道。当你使用空的项目模板,Startup 类不会有任何实质性的代码加入到管道中:

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  Startup
-default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> void-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Configure(IApplicationBuilder-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> app)
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  //-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  here!
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
-default'>-default'>-default'>}

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

现在,你可以运行应用了,但当前的应用没有任何功能。接下来我们会模拟 ”Starter Web” 项目模板来添加功能,例如 MVC 6、Entity Framework、身份验证、记录等功能。

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-menu-36'>添加欢迎界面

打开 project.json 文件。该文件包含了工程设置内容。dependencies 部分用于标注需要的 NuGet 包和类库。添加 Microsoft.AspNet.Diagnostics 包到列表中:

"":-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  "":-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "",
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  //-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Add-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> this:
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  "":-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ""
-default'>-default'>-default'>},

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

输入时,Visual Studio 会提供智能提示:

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/edc44e3f6e6c04313a1e7d4e99620c70.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="">

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/f36563c3132f46ac83ee79d144b54200.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="">

接下来,打开 Startup.cs 文件,添加以下代码:

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> System;
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Microsoft.AspNet.Builder;
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> TodoApi
-default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  Startup
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> void-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Configure(IApplicationBuilder-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> app)
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  //-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  code
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  app.UseWelcomePage();
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
-default'>-default'>-default'>}

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

点击-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  F5 运行,Visual Studio 启动浏览器,打开了 http://localhost:port/,端口号是一个 Visual Studio 随机分配的数字。运行效果如下:

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/6a06b8fbb28cc60dd6491d4caa5c334c.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt=""width="600"height="346">

欢迎界面是检验运行效果的快速入口,无需编写代码。

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

-menu-37'>创建 Web API

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

在本章节中,您将创建一个 ToDo 事项管理列表功能 API。首先,我们需要添加 ASP.NET MVC 6 到应用中。

添加 MVC 6 到 project.json 文件的依赖列表中:

"":-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  "":-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "",
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  "":-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "",
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  //-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> :
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  "":-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ""
-default'>-default'>-default'>},

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

接下来,添加 MVC 需求管道到 Startup.cs 文件中,

  • 使用 using 声明Microsoft.Framework.DependencyInjection。

  • 添加以下方法到 Startup 类中。

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> void-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ConfigureServices(IServiceCollection-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> services)
-default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  services.AddMvc();
-default'>-default'>-default'>}

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

  • 下面这段代码添加了 MVC 6 需要的所有依赖项,会自动在启动时调用ConfigureServices

    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> void-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Configure(IApplicationBuilder-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> app)
    -default'>-default'>{
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  //-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> :
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  app.UseMvc();
    -default'>-default'>-default'>}

    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

    以下是完整的 Startup 类代码:

    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> System;
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Microsoft.AspNet.Builder;
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Microsoft.AspNet.Http;
    //-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  :
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Microsoft.Framework.DependencyInjection;
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> TodoApi
    -default'>-default'>{
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  Startup
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  //-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Add-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> this-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> method:
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> void-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ConfigureServices(IServiceCollection-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> services)
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  services.AddMvc();
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> void-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Configure(IApplicationBuilder-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> app)
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  //-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> :
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  app.UseMvc();
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  app.UseWelcomePage();
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
    -default'>-default'>-default'>}

    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

    -menu-38'>添加 Model

    model 代表应用的数据域。在本示例中,model 中存储 ToDo 项。添加以下类到项目中:

    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> System.ComponentModel.DataAnnotations;
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> TodoApi.Models
    -default'>-default'>{
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  TodoItem
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> int-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Id-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>{-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ;-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ;-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>-default'>}
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  [Required]
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  Title-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>{-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ;-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ;-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>-default'>}
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> bool-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> IsDone-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>{-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ;-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ;-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>-default'>}
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
    -default'>-default'>-default'>}

    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

    为了保持项目的整洁,我创建了 Models 文件夹用于存放 Model 类,当然这不是必要的操作。

    -menu-39'>添加 Controller

    添加 controller 类用于处理 HTTP 请求。添加以下类到项目中:

    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Microsoft.AspNet.Mvc;
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> System.Collections.Generic;
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> System.Linq;
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> TodoApi.Models;
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> TodoApi.Controllers
    -default'>-default'>{
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  [Route("")]
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  TodoController-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> :-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Controller
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  List<TodoItem>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> _items-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  List<TodoItem>()
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> TodoItem-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>{-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Id-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 1,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Title-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ""-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>-default'>}
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>};
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  [HttpGet]
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> IEnumerable<TodoItem>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> GetAll()
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> _items;
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  [HttpGet("",-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Name-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "")]
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> IActionResult-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> GetById-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> (int-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> id)
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  var-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> item-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> _items.FirstOrDefault(x-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> x.Id-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ==-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> id);
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> (item-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ==-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> null)
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> HttpNotFound();
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  ObjectResult(item);
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  [HttpPost]
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> void-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> CreateTodoItem([FromBody]-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> TodoItem-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> item)
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> (!ModelState.IsValid)
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  Context.Response.StatusCode-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 400;
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
    -default'>else
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  item.Id-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 1+-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> _items.Max(x-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> (int?)x.Id)-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ??-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 0;
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  _items.Add(item);
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> url-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Url.RouteUrl("",-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> id-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> item.Id-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>-default'>},
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  Request.Scheme,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Request.Host.ToUriComponent());
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  Context.Response.StatusCode-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 201;
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  Context.Response.Headers[""]-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> url;
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  [HttpDelete("")]
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> IActionResult-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> DeleteItem(int-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> id)
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  var-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> item-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> _items.FirstOrDefault(x-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> x.Id-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ==-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> id);
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> (item-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ==-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> null)
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> HttpNotFound();
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  _items.Remove(item);
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  HttpStatusCodeResult(204);-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> //-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 201-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> No-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Content
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
    -default'>-default'>-default'>}

    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

    同样,我创建了 Controllers 文件夹用于存储 controller。

    在后续的章节中我们将进一步阐述关于 Controller 的代码。以下是 controller 实现的一些基础功能:

    ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/f5f2cf0d5f2a5f67a998a1ab4e97bddb.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="image" width="610" height="241">

    例如,下面是获取 ToDo 项目的 HTTP 请求的:

    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> http://localhost:5000/api/todo-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> HTTP/1.1
    User-Agent:-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Fiddler
    Host:-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> localhost:5000

    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

    下面是 response 流:

    HTTP/1.1-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 200-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> OK
    Content-Type:-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> application/json;charset=utf-8
    Server:-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Microsoft-HTTPAPI/2.0
    :-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Thu,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 30-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Oct-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 2014-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 22:40:31-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> GMT
    Content-Length:-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 46
    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
    [-default'>-default'>{"":1,"":"","":-default'>-default'>-default'>}]

    后续章节中我们将阐述以下内容:

    • 在配置方法中添加以下代码,UseMvc 方法用于添加 MVC 6 到管道。

  • 如何配置 ASP.NET 5.0 管道。

  • 在 IIS 外对立部署应用。

    -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

    原文链接:Create a Web API in MVC 6

在本文中,我们将一起查看 TodoController 类代码。

[Route] 属性定义了 Controller 的 URL 模板:

[Route("")]

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

所有符合该模板类型的 HTTP 请求都会被路由到该 controller。在本例中,路由的命名规范为对应 Controller 的前缀,对于 TodoController 类,路由模板为“api/todo”。

HTTP 方法

[HttpGet][HttpPost][HttpDelete] 属性定义为 controller 动作对应的 HTTP 方法(另外也有[HttpPut][HttpPatch] 属性,在本示例中没有使用。)

[HttpGet]
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> IEnumerable<TodoItem>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> GetAll()-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>{-default'>-default'>-default'>}
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
[HttpGet("",-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Name-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "")]
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> IActionResult-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> GetById-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> (int-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> id)-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>{-default'>-default'>-default'>}
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
[HttpPost]
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> void-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> CreateTodoItem([FromBody]-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> TodoItem-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> item)-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>{-default'>-default'>-default'>}
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
[HttpDelete("")]
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> IActionResult-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> DeleteItem(int-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> id)-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>{-default'>-default'>-default'>}

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

GetById 和 DeleteItem 方法中的参数可以增加路由的传递信息。所以,路由模板更加完善的写法为“api/[controller]/-default'>-default'>{id:int-default'>-default'>-default'>}”。

在“-default'>-default'>{id:int-default'>-default'>-default'>}”中,id 是变量,而“:int”代表参数为整型。以下为 URLs 实例:

http://localhost/api/todo/1
http://localhost/api/todo/42

不能写为:

http://localhost/api/todo/abc

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

注意 GetById 和 DeleteItem 方法同样拥有命名为 id 的参数。framework 会自动传递实参值到 Controller 中。例如,如果 URL 为http://localhost/api/todo/42,id 的值则为 42,这个过程为参数绑定。

CreateTodoItem 方法代表了另一个参数绑定:

[HttpPost]
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> void-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> CreateTodoItem([FromBody]-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> TodoItem-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> item)-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>{-default'>-default'>-default'>}

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

[FromBody] 属性指定 framework 从 Request 中反序列化 TodoItem 参数。

以下是 request 和 controller 动作的对应列表:

Request

Controller Action

GET /api/todo

GetAll

POST /api/todo

CreateTodoItem

GET /api/todo/1

GetById

DELETE /api/todo/1

DeleteItem

GET /api/todo/abc

none – returns 404

PUT /api/todo

none – returns 404

最后两个例子由于其他用途返回 404 错误。例如 ‘GET /api/todo/abc’,‘abc’ 实参是 GetById 方法中要求的整型数据类型。

Action 返回值

TodoController 类展示了多种 controller action 的返回值方法。

GetAll 方法返回了一个 CLR 对象。

[HttpGet]
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> IEnumerable<TodoItem>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> GetAll()
-default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> _items;
-default'>-default'>-default'>}

返回对象的序列化信息被存储到 Response 消息中。默认格式为 JSON,客户端同样可以接收 XML 数据格式:

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> http://localhost:5000/api/todo-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> HTTP/1.1
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
User-Agent:-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Fiddler
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
Host:-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> localhost:5000
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
Accept:-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> application/xml

Response:

HTTP/1.1-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 200-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> OK
Content-Type:-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> application/xml;charset=utf-8
Server:-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Microsoft-HTTPAPI/2.0
:-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Thu,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 30-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Oct-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 2014-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 22:40:10-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> GMT
Content-Length:-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 228
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
<ArrayOfTodoItem-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> xmlns:i=""-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> xmlns=""><TodoItem><Id>1</Id><IsDone></IsDone><Title>First-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Item</Title></TodoItem></ArrayOfTodoItem>

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

GetById 方法返回了一个 IActionResult 接口:

[HttpGet("",-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Name-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "")]
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> IActionResult-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> GetById-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> (int-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> id)
-default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  var-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> item-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> _items.FirstOrDefault(x-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> x.Id-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ==-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> id);
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> (item-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ==-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> null)
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> HttpNotFound();
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  ObjectResult(item);
-default'>-default'>-default'>}

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

如果有 URL 中对应的 id,则这个方法会返回 ObjectResult。返回 ObjectResult 和返回 CLR 模型相同。而方法中规定返回类型为 IActionResult。因此,该方法可以返回不同的类型。

如果没有对应 ID,则返回 HttpNotFound,页面会抛出 404 错误。

最后,CreateTodoItem 方法展示如何直接在方法中设置返回值:

[HttpPost]
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> void-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> CreateTodoItem([FromBody]-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> TodoItem-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> item)
-default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  //-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> (some-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> code-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  shown-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> here)
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  Context.Response.StatusCode-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 201;
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  Context.Response.Headers[""]-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> url;
-default'>-default'>-default'>}

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

这种方法的缺陷是很难进行单元测试。(关于测试相关讨论,可以参考 Unit Testing Controllers in ASP.NET Web API)。

依赖注入

MVC 6 内置了依赖注入功能。下面,让我们创建一个包含 ToDo 列表的 repository 类。

首先,为 repository 定义一个接口:

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> System.Collections.Generic;
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> TodoApi.Models
-default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  ITodoRepository
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  IEnumerable<TodoItem>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> AllItems-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>{-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ;-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>-default'>}
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  void-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Add(TodoItem-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> item);
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  TodoItem-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> GetById(int-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> id);
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  bool-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> TryDelete(int-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> id);
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
-default'>-default'>-default'>}

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

之后定义具体实现方法。

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> System;
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> System.Collections.Generic;
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> System.Linq;
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> TodoApi.Models
-default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  TodoRepository-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> :-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ITodoRepository
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> List<TodoItem>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> _items-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  List<TodoItem>();
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> IEnumerable<TodoItem>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> AllItems
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
get
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> _items;
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> TodoItem-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> GetById(int-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> id)
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> _items.FirstOrDefault(x-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> x.Id-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ==-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> id);
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> void-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Add(TodoItem-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> item)
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  item.Id-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 1-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> +-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> _items.Max(x-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> (int?)x.Id)-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ??-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 0;
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  _items.Add(item);
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> bool-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> TryDelete(int-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> id)
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  var-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> item-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> GetById(id);
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> (item-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ==-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> null)
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ;
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  _items.Remove(item);
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ;
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
-default'>-default'>-default'>}

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

使用构造函数注入 repository 到 controller:

[Route("")]
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  TodoController-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> :-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Controller
-default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  //-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Remove-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> this-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> code:
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  //-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  List<TodoItem>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> _items-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  List<TodoItem>()
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  //-default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  //-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> TodoItem-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>{-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Id-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 1,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Title-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ""-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>-default'>}
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  //-default'>-default'>-default'>};
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  //-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Add-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> this-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> code:
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  ITodoRepository-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> _repository;
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> TodoController(ITodoRepository-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> repository)
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  _repository-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> repository;
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

然后更新 controller 方法到 repository:

[HttpGet]
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> IEnumerable<TodoItem>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> GetAll()
-default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> _repository.AllItems;
-default'>-default'>-default'>}
[HttpGet("",-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Name-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "")]
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> IActionResult-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> GetById(int-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> id)
-default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  var-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> item-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> _repository.GetById(id);
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> (item-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ==-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> null)
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> HttpNotFound();
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  ObjectResult(item);
-default'>-default'>-default'>}
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
[HttpPost]
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> void-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> CreateTodoItem([FromBody]-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> TodoItem-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> item)
-default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> (!ModelState.IsValid)
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  Context.Response.StatusCode-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 400;
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
-default'>else
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  _repository.Add(item);
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> url-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Url.RouteUrl("",-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> id-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> item.Id-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>-default'>},-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Request.Scheme,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Request.Host.ToUriComponent());
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  Context.Response.StatusCode-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 201;
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  Context.Response.Headers[""]-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> =-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> url;
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
-default'>-default'>-default'>}
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
[HttpDelete("")]
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> IActionResult-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> DeleteItem(int-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> id)
-default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> (_repository.TryDelete(id))
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  HttpStatusCodeResult(204);-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> //-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 201-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> No-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> Content
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
-default'>else
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> HttpNotFound();
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
-default'>-default'>-default'>}

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

我们需要注册 repository 到依赖注入系统才能使其启作用。在 Startup 类中,添加以下代码:

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> void-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ConfigureServices(IServiceCollection-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> services)
-default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  services.AddMvc();
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  //-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  code
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  services.AddSingleton<ITodoRepository,-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> TodoRepository>();
-default'>-default'>-default'>}

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

应用运行时,一旦 controller 被创建,framework 自动注入 TodoRepository 到 controller 中,它将作用于整个应用的生命周期。

在 IIS 外独立部署应用

默认情况下,当你点击 F5,应用会在 IIS Express 中运行。你可以在工具栏中看到 IIS Express 图标。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/84f2f492f5c540b1ee33469c0ebb07b8.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="clip_image001" width="382" height="169">

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

ASP.NET 5.0 可以部署到不同的服务器中,在本节中,我们将使用可运行在 IIS 外的 WebListener。

注意:将应用部署在 IIS 中仍有诸多的优势,例如安全性、进度管理等。

在 project.json 文件,添加 Microsoft.AspNet.Server.WebListener 包:

"":-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  "":-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "",
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  "":-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "",
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  "":-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> "",
// New:
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  "":-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ""
-default'>-default'>-default'>},

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

接下来添加以下选项到 project.json。

-default'>-default'>{
// Other sections not shown
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  "":-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> -default'>-default'>{
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  "":-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> ""
-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>  -default'>-default'>-default'>}
-default'>-default'>-default'>}

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

“commands”中包含了可以传递给 K 运行时的预定义指令列表。在这个例子中,“web”是指令名称,它可以是任意实际指令名称值。

Microsoft.AspNet.Hosting 程序集用于部署 ASP.NET 5.0 应用。

· –server 标记用于声明服务器,在这个例子中为 WebListener。

· –server.urls 标记提供需要监听的 URL。

保存 project.json 文件。在 Solution Explorer 中,右键点击工程选择Properties。在 Properties 栏,点击Debug。在Debug target 下,更改“IIS Express”为“web”。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/961634a641d90ed8cefeecfa2cda2d75.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="clip_image001[5]" width="601" height="205">

-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'>-default'> 

点击 F5 运行 App。Visual Studio 这时会运行启动 WebListener 的控制台应用。

ASP.NET 5 系列教程-src="https://s.xgss.net/sky/2022-01-21/d7e5359b7dac7e39a361712e3745611d.png" data-lazy="true" src="https://www.xgss.net/wp-content/themes/puock/assets/img/z/load.svg" alt="clip_image001[7]" width="610" height="294">

打开浏览器,输入 http://localhost:5000。你可以看到欢迎界面。

如果需要使用 IIS,在上一步骤中更改 Debug Target 为“IIS Express”即可。

这篇文章为本系列文章的最后一篇,感谢大家的关注。

原文链接:http://www.asp.net/vnext/overview/aspnet-vnext/create-a-web-api-with-mvc-6

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-01/127759.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计30226字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中