ASP.NET Core MVC の概要Overview of ASP.NET Core MVC

によってSteve SmithBy Steve Smith

ASP.NET Core MVC は、web アプリを構築するための豊富なフレームワークと、モデル ビュー コント ローラーを使用して Api デザイン パターンです。ASP.NET Core MVC is a rich framework for building web apps and APIs using the Model-View-Controller design pattern.

MVC パターンとは何ですか。What is the MVC pattern?

モデル ビュー コント ローラー (MVC) アーキテクチャ パターンでは、アプリケーション コンポーネントの次の 3 つの主要グループに: モデル、ビュー、およびコント ローラー。The Model-View-Controller (MVC) architectural pattern separates an application into three main groups of components: Models, Views, and Controllers. このパターンを実現するために役立つ関心の分離です。This pattern helps to achieve separation of concerns. このパターンを使用して、ユーザーの要求は、担当するユーザーの操作の実行やクエリの結果を取得するモデルはコント ローラーにルーティングされます。Using this pattern, user requests are routed to a Controller which is responsible for working with the Model to perform user actions and/or retrieve results of queries. コント ローラーは、ユーザーに表示するビューを選択し、必要なすべてのモデル データを提供します。The Controller chooses the View to display to the user, and provides it with any Model data it requires.

次の図は、次の 3 つの主要なコンポーネントと、どれが、他のユーザーを参照します。The following diagram shows the three main components and which ones reference the others:

MVC パターン

この概念の責任のでは、コード、デバッグ、およびテスト (モデル、ビュー、またはコント ローラー) が持っているもの 1 つのジョブを簡単になっているために、複雑さの観点からアプリケーションを拡張できます (およびに従って、単一責任の原則。).This delineation of responsibilities helps you scale the application in terms of complexity because it’s easier to code, debug, and test something (model, view, or controller) that has a single job (and follows the Single Responsibility Principle). 更新プログラム、テスト、および分散これら 3 つの領域の 2 つ以上の依存関係のあるコードをデバッグすることが難しくなります。It's more difficult to update, test, and debug code that has dependencies spread across two or more of these three areas. たとえば、ユーザー インターフェイス ロジックは、ビジネス ロジックよりも頻繁に変更する傾向があります。For example, user interface logic tends to change more frequently than business logic. プレゼンテーション コードとビジネス ロジックを 1 つのオブジェクトに結合し場合、は、ユーザー インターフェイスを変更するたびに、ビジネス ロジックを格納するオブジェクトの変更が必要です。If presentation code and business logic are combined in a single object, you have to modify an object containing business logic every time you change the user interface. これは、エラーが発生して、すべてのビジネス ロジックの再テストごとの最小ユーザー インターフェイスを変更した後を必要とする可能性があります。This is likely to introduce errors and require the retesting of all business logic after every minimal user interface change.

注意

ビューとコント ローラーの両方は、モデルによって異なります。Both the view and the controller depend on the model. ただし、モデルは、ビューでも、コント ローラーに依存します。However, the model depends on neither the view nor the controller. これは、分離の主要な利点の 1 つです。This is one of the key benefits of the separation. この分離により、モデルをビルドおよびテストできる、ビジュアル化に依存しません。This separation allows the model to be built and tested independent of the visual presentation.

モデルの責任Model Responsibilities

MVC アプリケーション内のモデルでは、アプリケーションやビジネス ロジックによって実行される操作の状態を表します。The Model in an MVC application represents the state of the application and any business logic or operations that should be performed by it. モデルでは、アプリケーションの状態を保存するための実装ロジックとビジネス ロジックをカプセル化する必要があります。Business logic should be encapsulated in the model, along with any implementation logic for persisting the state of the application. 厳密に型指定されたビューはされる通常具体的には、データを含むように設計 ViewModel 型を使用してそのビューに表示するにはコント ローラーが作成され、モデルからこれらの ViewModel インスタンスを作成します。Strongly-typed views will typically use ViewModel types specifically designed to contain the data to display on that view; the controller will create and populate these ViewModel instances from the model.

注意

MVC アーキテクチャ パターンを使用するアプリでモデルを整理する方法があります。There are many ways to organize the model in an app that uses the MVC architectural pattern. 詳細については、いくつかさまざまな種類の種類のモデルのします。Learn more about some different kinds of model types.

ビューの責任View Responsibilities

ビューは、ユーザー インターフェイスからコンテンツの表示を担当します。Views are responsible for presenting content through the user interface. 使用する、 Razor ビュー エンジンHTML マークアップに .NET コードを埋め込む。They use the Razor view engine to embed .NET code in HTML markup. ビューの中で最低限のロジックが存在する必要があり、それらで任意のロジックは、コンテンツを表示することに関連する必要があります。There should be minimal logic within views, and any logic in them should relate to presenting content. 複雑なモデルからデータを表示するためにファイルのビューに大量のロジックを実行する必要を検索する場合は、使用を検討して、ビュー コンポーネントViewModel、または表示を簡略化のテンプレートの表示。If you find the need to perform a great deal of logic in view files in order to display data from a complex model, consider using a View Component, ViewModel, or view template to simplify the view.

コント ローラーの機能Controller Responsibilities

コント ローラーは、ユーザーとの対話を処理し、モデルでは、作業、最終的にレンダリングするビューを選択するコンポーネントです。Controllers are the components that handle user interaction, work with the model, and ultimately select a view to render. MVC アプリケーションでは、ビューのみ情報が表示されます。コント ローラーは、処理し、ユーザー入力との対話に応答します。In an MVC application, the view only displays information; the controller handles and responds to user input and interaction. MVC パターンでは、コント ローラー、初期のエントリ ポイントは、どのモデルの種類を使用して表示するには、どのビューの選択を担当する (そのため、名前の制御、アプリが特定の要求に応答する方法)。In the MVC pattern, the controller is the initial entry point, and is responsible for selecting which model types to work with and which view to render (hence its name - it controls how the app responds to a given request).

注意

多数の責任でコント ローラーが過度に複雑ないない必要があります。Controllers should not be overly complicated by too many responsibilities. コント ローラーのロジックが過度に複雑になることを防止するには、単一責任の原則プッシュ ビジネス ロジック、コント ローラー アウトし、ドメイン モデルにします。To keep controller logic from becoming overly complex, use the Single Responsibility Principle to push business logic out of the controller and into the domain model.

ヒント

コント ローラーのアクションは、同じ種類のアクションを頻繁に実行する場合は、行うことができる、繰り返さない自分で原則にこれらの一般的なアクションを移動することによってフィルターです。If you find that your controller actions frequently perform the same kinds of actions, you can follow the Don't Repeat Yourself principle by moving these common actions into filters.

ASP.NET Core MVC は、新機能What is ASP.NET Core MVC

ASP.NET Core MVC フレームワークは、ライトウェイト、オープン ソース、ASP.NET Core で使用するために最適化された高テスト可能なプレゼンテーション フレームワークです。The ASP.NET Core MVC framework is a lightweight, open source, highly testable presentation framework optimized for use with ASP.NET Core.

ASP.NET Core MVC は、問題を明確に分離できるようにする動的な web サイトを構築するパターンに基づく方法を提供します。ASP.NET Core MVC provides a patterns-based way to build dynamic websites that enables a clean separation of concerns. マークアップを完全に制御を規格をサポートしては最新の web 標準を使用します。It gives you full control over markup, supports TDD-friendly development and uses the latest web standards.

フィーチャーFeatures

ASP.NET Core MVC、次のとおりです。ASP.NET Core MVC includes the following:

ルーティングRouting

ASP.NET Core MVC がの上に構築されたASP.NET Core のルーティング、できる強力な URL マッピング コンポーネントと、わかりやすく検索可能な Url を持つアプリケーションをビルドします。ASP.NET Core MVC is built on top of ASP.NET Core's routing, a powerful URL-mapping component that lets you build applications that have comprehensible and searchable URLs. これにより、web サーバー上のファイルの整理方法に関係なく、リンクの生成と検索エンジン最適化 (SEO) にとっても、アプリケーションの URL の名前付けパターンを定義することができます。This enables you to define your application's URL naming patterns that work well for search engine optimization (SEO) and for link generation, without regard for how the files on your web server are organized. ルート値の制約、既定値および省略可能な値をサポートする便利なルート テンプレートの構文を使用して、ルートを定義することができます。You can define your routes using a convenient route template syntax that supports route value constraints, defaults and optional values.

ルーティング規約に基づく形式の URL をグローバルに定義することにより、アプリケーションを受け入れるし、特定のコント ローラー上の特定のアクション メソッドにマップそれらのすべてがどのように書式設定します。Convention-based routing enables you to globally define the URL formats that your application accepts and how each of those formats maps to a specific action method on given controller. 着信要求を受信すると、ルーティング エンジンは、URL を解析および定義済みの URL の形式の 1 つに一致する、関連付けられているコント ローラーのアクション メソッドを呼び出します。When an incoming request is received, the routing engine parses the URL and matches it to one of the defined URL formats, and then calls the associated controller's action method.

routes.MapRoute(name: "Default", template: "{controller=Home}/{action=Index}/{id?}");

属性のルーティングコント ローラーとアクションは、アプリケーションのルートを定義する属性で修飾することによって、ルーティング情報を指定することができます。Attribute routing enables you to specify routing information by decorating your controllers and actions with attributes that define your application's routes. これは、コント ローラーと関連付けられているアクションの横にある、route 定義を配置していることを意味します。This means that your route definitions are placed next to the controller and action with which they're associated.

[Route("api/[controller]")]
public class ProductsController : Controller
{
  [HttpGet("{id}")]
  public IActionResult GetProduct(int id)
  {
    ...
  }
}

モデル バインディングModel binding

ASP.NET Core MVCモデル バインディングクライアント要求データ (フォームの値、ルート データ、クエリ文字列パラメーター、HTTP ヘッダー)、コント ローラーを処理できるオブジェクトを変換します。ASP.NET Core MVC model binding converts client request data (form values, route data, query string parameters, HTTP headers) into objects that the controller can handle. その結果、コント ローラーのロジックを受信した要求データを見つけ出しの作業を行うにはありません。単に、そのアクション メソッドにパラメーターとデータを持ちます。As a result, your controller logic doesn't have to do the work of figuring out the incoming request data; it simply has the data as parameters to its action methods.

public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null) { ... }

モデルの検証Model validation

ASP.NET Core MVC をサポートしている検証データ注釈検証属性を持つモデル オブジェクトを修飾します。ASP.NET Core MVC supports validation by decorating your model object with data annotation validation attributes. 検証属性の値は、サーバーに送信される前に、クライアント側で確認されますだけでなくコント ローラー アクションの前に、サーバー上と呼びます。The validation attributes are checked on the client side before values are posted to the server, as well as on the server before the controller action is called.

using System.ComponentModel.DataAnnotations;
public class LoginViewModel
{
    [Required]
    [EmailAddress]
    public string Email { get; set; }

    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }

    [Display(Name = "Remember me?")]
    public bool RememberMe { get; set; }
}

コント ローラーのアクション:A controller action:

public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
    if (ModelState.IsValid)
    {
      // work with the model
    }
    // If we got this far, something failed, redisplay form
    return View(model);
}

フレームワークでは、クライアントとサーバーの両方の要求データの検証を処理します。The framework will handle validating request data both on the client and on the server. モデルの種類に対して指定された検証ロジックは控えめな注釈としてレンダリングされるビューに追加され、と共にブラウザーに適用されるjQuery 検証です。Validation logic specified on model types is added to the rendered views as unobtrusive annotations and is enforced in the browser with jQuery Validation.

依存関係の挿入Dependency injection

ASP.NET Core はの組み込みサポート依存性の注入 (DI)です。ASP.NET Core has built-in support for dependency injection (DI). MVC では ASP.NET Core、コント ローラーに従うように、コンス トラクターからサービスを必要な要求、明示的な依存関係の原則です。In ASP.NET Core MVC, controllers can request needed services through their constructors, allowing them to follow the Explicit Dependencies Principle.

アプリケーションで使用できるもファイル ビュー内の依存性の注入を使用して、@injectディレクティブ。Your app can also use dependency injection in view files, using the @inject directive:

@inject SomeService ServiceName
<!DOCTYPE html>
<html lang="en">
<head>
    <title>@ServiceName.GetTitle</title>
</head>
<body>
    <h1>@ServiceName.GetTitle</h1>
</body>
</html>

フィルターFilters

フィルター例外処理や承認などの横断的関心事をカプセル化する開発者を支援します。Filters help developers encapsulate cross-cutting concerns, like exception handling or authorization. フィルターは、アクション メソッドの実行中のカスタムの前処理および後処理ロジックを有効にして、特定の要求の実行パイプライン内の特定の時点で実行するように構成できます。Filters enable running custom pre- and post-processing logic for action methods, and can be configured to run at certain points within the execution pipeline for a given request. フィルターは属性としてアクションまたはコント ローラーに適用できます (または、グローバルに実行することができます)。Filters can be applied to controllers or actions as attributes (or can be run globally). いくつかのフィルター (などAuthorize) フレームワークに含まれています。Several filters (such as Authorize) are included in the framework.

[Authorize]
   public class AccountController : Controller
   {

区分Areas

領域大規模な ASP.NET Core MVC Web アプリケーションを小さい機能グループに分割する方法を提供します。Areas provide a way to partition a large ASP.NET Core MVC Web app into smaller functional groupings. 領域は、事実上、アプリケーション内部 MVC 構造です。An area is effectively an MVC structure inside an application. MVC プロジェクトでは、モデル、コント ローラー、およびビューなどの論理コンポーネントが、他のフォルダーに保持され、MVC では、名前付け規則を使用して、これらのコンポーネント間のリレーションシップを作成します。In an MVC project, logical components like Model, Controller, and View are kept in different folders, and MVC uses naming conventions to create the relationship between these components. 大規模なアプリの機能の個別の高レベル領域に、アプリを分割すると便利な場合があります。For a large app, it may be advantageous to partition the app into separate high level areas of functionality. たとえば、電子商取引を使用したアプリなど、チェック アウト、請求、および検索などの複数の事業単位です。各事業ユニットは、独自の論理コンポーネント ビュー、コント ローラー、およびモデルがあります。For instance, an e-commerce app with multiple business units, such as checkout, billing, and search etc. Each of these units have their own logical component views, controllers, and models.

Web ApiWeb APIs

Web サイトを構築するための優れたプラットフォームだけでなくは、ASP.NET Core MVC は、Web Api を構築するための優れたサポートがします。In addition to being a great platform for building web sites, ASP.NET Core MVC has great support for building Web APIs. さまざまなブラウザーやモバイル デバイスを含む、クライアントに到達可能なサービスをビルドすることができます。You can build services that can reach a broad range of clients including browsers and mobile devices.

フレームワークの組み込みサポートを備えた HTTP コンテンツ ネゴシエーションをサポートしていますデータの書式設定JSON または XML として。The framework includes support for HTTP content-negotiation with built-in support for formatting data as JSON or XML. 書き込むカスタム フォーマッタユーザー独自の形式のサポートを追加します。Write custom formatters to add support for your own formats.

Hypermedia のサポートを有効にするのにには、リンクの生成を使用します。Use link generation to enable support for hypermedia. サポートを容易にできるクロス オリジン リソース共有 (CORS)に Web Api は、複数の Web アプリケーションで共有できるようにします。Easily enable support for cross-origin resource sharing (CORS) so that your Web APIs can be shared across multiple Web applications.

テストの容易性Testability

インターフェイスと依存関係の挿入のフレームワークの使用に適してを単体テスト、行い、フレームワークには、構成する (Entity Framework の考えます、InMemory プロバイダー) のような機能が含まれています統合テストクイック。簡単にもします。The framework's use of interfaces and dependency injection make it well-suited to unit testing, and the framework includes features (like a TestHost and InMemory provider for Entity Framework) that make integration testing quick and easy as well. 詳細についてはテスト コント ローラー ロジックです。Learn more about testing controller logic.

Razor ビュー エンジンRazor view engine

ASP.NET Core MVC ビューを使用して、 Razor ビュー エンジンビューをレンダリングします。ASP.NET Core MVC views use the Razor view engine to render views. Razor は、埋め込みの c# コードを使用して、ビューを定義するためのコンパクトな表現力が豊かおよび滑らかなテンプレート マークアップ言語です。Razor is a compact, expressive and fluid template markup language for defining views using embedded C# code. Razor を使用して、サーバー上の web コンテンツを動的に生成します。Razor is used to dynamically generate web content on the server. サーバー コード クライアント側のコンテンツおよびコードを混在しているクリーンにことができます。You can cleanly mix server code with client side content and code.

<ul>
  @for (int i = 0; i < 5; i++) {
    <li>List item @i</li>
  }
</ul>

定義することができます、Razor ビュー エンジンを使用してレイアウト部分ビューと置き換え可能なセクションです。Using the Razor view engine you can define layouts, partial views and replaceable sections.

厳密に型指定されたビューStrongly typed views

MVC の razor ビューできる厳密に型指定、モデルに基づく。Razor views in MVC can be strongly typed based on your model. コント ローラーは、型チェックと IntelliSense をサポートして、ビューを有効にするビューを厳密に型指定されたモデルを渡すことができます。Controllers can pass a strongly typed model to views enabling your views to have type checking and IntelliSense support.

たとえば、次のビューが型のモデルを定義IEnumerable<Product>:For example, the following view defines a model of type IEnumerable<Product>:

@model IEnumerable<Product>
<ul>
    @foreach (Product p in Model)
    {
        <li>@p.Name</li>
    }
</ul>

タグ ヘルパーTag Helpers

タグ ヘルパーを作成して、Razor ファイルでの HTML 要素のレンダリングに参加させるサーバー側コードを有効にします。Tag Helpers enable server side code to participate in creating and rendering HTML elements in Razor files. カスタム タグを定義するタグ ヘルパーを使用することができます (たとえば、 <environment>) または既存のタグの動作を変更する (たとえば、 <label>)。You can use tag helpers to define custom tags (for example, <environment>) or to modify the behavior of existing tags (for example, <label>). タグ ヘルパーは、要素名とその属性に基づいて特定の要素にバインドします。Tag Helpers bind to specific elements based on the element name and its attributes. HTML 編集エクスペリエンスを維持したまま、サーバー側のレンダリングの利点を提供します。They provide the benefits of server-side rendering while still preserving an HTML editing experience.

これは、フォーム、リンク、読み込みの資産および詳細 - およびさらに高いで利用できるパブリックの GitHub リポジトリとして NuGet パッケージの作成などの一般的なタスクの多くの組み込みタグ ヘルパー。There are many built-in Tag Helpers for common tasks - such as creating forms, links, loading assets and more - and even more available in public GitHub repositories and as NuGet packages. タグ ヘルパーは、C# の場合は、作成し、要素名、属性名、または親タグに基づく HTML 要素を対象にします。Tag Helpers are authored in C#, and they target HTML elements based on element name, attribute name, or parent tag. たとえば、あらかじめ登録された LinkTagHelper をへのリンクの作成に使用することができます、Loginのアクション、 AccountsController:For example, the built-in LinkTagHelper can be used to create a link to the Login action of the AccountsController:

<p>
    Thank you for confirming your email.
    Please <a asp-controller="Account" asp-action="Login">Click here to Log in</a>.
</p>

EnvironmentTagHelper開発、ステージング、運用環境など、ランタイム環境に基づきます (たとえば、生または縮小された) ビュー内の別のスクリプトを含めるために使用できます。The EnvironmentTagHelper can be used to include different scripts in your views (for example, raw or minified) based on the runtime environment, such as Development, Staging, or Production:

<environment names="Development">
    <script src="~/lib/jquery/dist/jquery.js"></script>
</environment>
<environment names="Staging,Production">
    <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.1.4.min.js"
            asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
            asp-fallback-test="window.jQuery">
    </script>
</environment>

タグ ヘルパーは、HTML に適した開発エクスペリエンスと HTML および Razor マークアップを作成するための豊富な IntelliSense 環境を提供します。Tag Helpers provide an HTML-friendly development experience and a rich IntelliSense environment for creating HTML and Razor markup. 組み込みタグ ヘルパーのほとんどは、既存の HTML 要素をターゲットし、要素のサーバー側の属性を指定します。Most of the built-in Tag Helpers target existing HTML elements and provide server-side attributes for the element.

コンポーネントの表示View Components

コンポーネントの表示レンダリング ロジックをパッケージ化し、アプリケーション全体で再利用することを許可します。View Components allow you to package rendering logic and reuse it throughout the application. 似て部分ビューが関連付けられているロジックを使用します。They're similar to partial views, but with associated logic.