ASP.NET MVCを一緒にマスターします。 はじめに

少しの背景


私の友人と私は、Web開発とそれに関連するすべてに完全に興味があります。 今年、大学は学生向けのWebポータルを作成するように命じられました。このポータルでは、成績に関する最新情報、スケジュールなどを取得できます。 当然、「設計局」(大学でソフトウェアの開発を担当するいわゆる部門)は、ためらうことなく、タスクを学生に移すことを決めました。 私たちがこれらの学生の中にいたのは偶然で、ASP.NET Web FormsまたはPHP Symfonyの選択を提供されました。 そして、タスクを複雑にし、新しいことを学ぶために、ASP.NET MVCでタスクを実行できるように要求しました。 プロジェクトは現在完全に開発中であり、どのように終了するかを考えて、プロジェクトのソースコードをここに投稿します。 しかし、それについては後で詳しく説明します。 ですから、何らかの形で知識を体系化し、専門家からアドバイスを得るために、他の人がこの美しいフレームワークを学び始めるのに役立つ一連の記事を始めることにしました。 じゃあ? さあ始めましょう!

そのため、ロボットには少なくとも次のものが必要です。

プロジェクトをゼロから作成することを提案します。これは、ASP.NET MVCプロジェクトの仕組みと構築方法をよりよく理解するのに役立ちます。さらに、標準プロジェクトの作成中に存在するデモコードが好きではありません。


きれいなスレートから始めましょう。


C#のクラスライブラリプロジェクトを作成することから始めましょう。 ここから不要なものをすべて削除します。Class1.csAssemblyInfo.csPropertiesディレクトリから、 Referencesにあるすべてを削除します。 その結果、空のプロジェクトが作成されます。

プロジェクトの種類


Visual Studioは多くの異なるタイプのプロジェクトをサポートしており、それぞれがスタジオの動作が異なることを知っています。 たとえば、作成したクラスライブラリプロジェクト(Ctrl-F5)を実行しようとすると、次のメッセージが表示されます。

A project with an Output Type of Class Library cannot be started directly.

私たちの目標はASP.NET MVCプロジェクトを作成することなので、それに応じてプロジェクトのタイプを変更します。 これを行うには、プロジェクトのコンテキストメニューから[ プロジェクトアンロード ]を選択し、編集するプロジェクトファイルを開いて(プロジェクトを右クリック- 編集 )、 クラスライブラリなどのプロジェクトのGUIDを追加します。

< ProjectTypeGuids > {fae04ec0-301f-11d3-bf4b-00c04f79efbc} </ ProjectTypeGuids >

次に、WebアプリケーションのGUIDを追加します。

< ProjectTypeGuids > {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} </ ProjectTypeGuids >

Guid for Web Applicationが最初でなければなりません。そうでないと、VSはプロジェクトをリロードしません。

プロジェクトをリロードした後(プロジェクトファイルを右クリック- プロジェクトのリロード )、プロジェクトアイコンが変更されたことがわかります。 ここでプロジェクトを起動しようとすると、スタジオはエクスプローラーを起動します。 さらに、Webアプリケーションは通常の操作のために追加の設定を必要とするため、プロジェクトの再起動後、スタジオはProjectExtensions構成セクションを調整します。

プロジェクトのタイプを変更する最後のステップは、プロジェクトの出力パスbin \に調整することです。 これを行うには、プロジェクトのプロパティで[ ビルド ]タブに移動し、[ 出力パス ]を変更します
画像

ルーティング設定


ASP.NET MVCでは、他のほとんどのMVCフレームワークと同様に、ASP.NET WebFormsで実装されているように、URLはディスク上のファイルへの実際のパスを表示しません。 MVCでは、urlの外観はより直感的です[コントローラー/アクション]。この変換はルーティングと呼ばれ、正しく機能するためにプロジェクトにいくつかの変更を加える必要があります。

まず、 Web.configを追加ます。 それをきれいにして、以下を追加します:

< httpModules >
< add name ="UrlRoutingModule" type ="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</ httpModules >


このモジュールは、要求されたURLが指定されたルートと一致するかどうかを確認し、一致が見つかった場合、 HttpHandlerが制御を取得するために必要です。

最初のアプリケーションを作成しましょう


ルーティングの決定は、アプリケーションの起動時に最もよく行われます( Application_Start )。 これを行うには、グローバルアプリケーションクラス( Global.asaxファイル)をプロジェクトに追加する必要があります。 Global.asax.cs (分離コードファイル)ファイルをApplication.csに置き換えることを好みます
次のGlobal.asax取得します

<%@ Application Inherits= "Mvc.Application" %>

ルート定義


グローバルアプリケーションクラスを追加した後、Visual Studioはプロジェクトにいくつかの参照を追加しました。
画像

System.Web.Routingアセンブリへのリンクを追加します。 (このアセンブリはNET 3.5 Service Pack 1でインストールされます)
次に、 Application_Startで RegisterRoutesメソッドへの呼び出しを追加します

using System.Web;

namespace Mvc
{
public class Application : HttpApplication
{
public void Application_Start()
{
Router.RegisterRoutes(RouteTable.Routes);
}
}
}


ルートを定義するには、後で定義するRouterクラスを使用します。 RouteTable.Routesに注意してください。これは、アプリケーションのすべてのルートを含むRouteCollectionタイプのコレクションであり、 RegisterRoutesメソッドはこのコレクションにデータを入力します。 ルート自体には、リクエストの処理方法に関する情報が含まれています。

routes.MapRoute(
"Default" , // Route name
"{controller}/{action}/{id}" , // URL with parameters
new { controller = "Home" , action = "Index" , id = "" } // Parameter defaults
);


UrlRoutingModuleは、現在の要求を定義済みのルートと比較し、それに応じて処理します。 要求が指定したルートの1つと一致する場合、 RouteHandlerは制御をHttpHandlerに転送します

次に、 System.Web.Mvcアセンブリへのリンクを追加し、 ルータークラス自体を定義します。 Routerクラスは次のようになります。

using System.Web.Mvc;
using System.Web.Routing;

namespace Mvc
{
public static class Router
{
public static void RegisterRoutes(RouteCollection routes)
{
Route route = new Route( "{controller}/{action}" , new MvcRouteHandler());
routes.Add(route);
}
}
}


MvcRouteHandlerは、 RequestContextからのデータに基づいてリクエストを処理するMvcHandlerのインスタンスを作成します。
ルートには、使用する(インスタンス化する)コントローラーと、このコントローラーのどのメソッドを呼び出すかに関する情報が含まれている必要があります。


コントローラーの追加


通常、すべてのコントローラーが含まれるControllersディレクトリーにコントローラーを追加します

using System.Web.Mvc;

namespace Mvc.Controllers
{
public class HomeController : Controller
{
public string Index()
{
return "Hello World!" ;
}
}
}


このコントローラーは1つのIndex()メソッドを定義します。 アドレス〜/ home / indexに移動すると、「Hello World!」という碑文が表示されます。

次に、 RegisterRoutesメソッドを次のように変更します。

public static void RegisterRoutes(RouteCollection routes)
{
Route route = new Route(
"{controller}/{action}" ,
new RouteValueDictionary( new { Controller = "Home" , Action = "Index" }),
new MvcRouteHandler());
routes.Add( "Default" , route);
}


実際、デフォルトでHomeコントローラーのIndexメソッドが実行されるようにしました、つまり、アドレス〜に移動すると、 Index()の実行結果が表示されます。

ビューを追加する


ページ全体を文字列として返すことは、Webアプリケーションを構築するためのベストプラクティスとはほど遠いため、ページデザインを含むビューを追加します。

Views / Homeフォルダーの次の階層を作成し、MVCプロジェクトで作業していることをスタジオに伝える新しいGUIDを追加します

< ProjectTypeGuids > {603c0e0b-db56-11dc-be95-000d561079b0};{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} </ ProjectTypeGuids >


プロジェクトをリロードすると、MVCに固有の新しいタイプの要素が利用可能になります。
画像

ビューとコンポーネント(コントロール)はSystem.Web.Mvcを継承します(<%@ Page%>ディレクティブを調べることでこれを確認できます)。 WebFormsViewEngineは、 WebFormsと同じコンパイル原則を使用します。 つまり、正しい操作のために、 web.configでこのアセンブリへのリンクを追加する必要があります。

< compilation debug ="true" >
< assemblies >
< add assembly ="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</ assemblies >


次に、MVCビューページIndex.aspxViews / Homeディレクトリに追加し、 Index()メソッドによって返されるタイプを変更します。

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


最後に行う必要があるのは、Viewsフォルダーにあるビューへの直接アクセスを防ぐことです。 (〜/ views / home / index.aspxに移動すると、このページの内容が表示されます。)これを防ぐには、 Web.configに次の行を追加します。

<? xml version ="1.0" ? >
< configuration >
< system.web >
< authorization >
< deny users ="*" />
</ authorization >
</ system.web >
</ configuration >


名前空間をアセンブリにインポートする


WebFormsと同様に、ASP.NET MVCビューは別のaspnet_compilerプロセスでコンパイルされます。 アプリケーションで使用するアセンブリへの参照をWebアプリケーションの構成ファイルに追加するまで、コンパイラは使用するアセンブリを認識しません。

< compilation debug ="true" >
< assemblies >
< add assembly ="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
< add assembly ="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
< add assembly ="System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</ assemblies >
</ compilation >


これで、コンパイラは、これらのアセンブリのいずれかで定義された型を使用する試みに適切に対応します。 次に、便宜上、Web.configに名前空間を追加します。これにより、短い型名を使用できるようになります。

< pages >
< namespaces >
< add namespace ="System.Collections.Generic" />
< add namespace ="System.Linq" />
< add namespace ="System.Web.Mvc" />
< add namespace ="System.Web.Mvc.Html" />
</ namespaces >
</ pages >


多くの新しいコンストラクトがC#の最新バージョンに追加されました。もちろん、それらを表現で使用したいと思います。 これを行うには、さらにいくつかの構成を追加します。

< system.codedom >
< compilers >
< compiler language ="c#;cs;csharp" extension =".cs" type ="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
< providerOption name ="CompilerVersion" value ="v3.5" />
< providerOption name ="WarnAsError" value ="false" />
</ compiler >
</ compilers >
</ system.codedom >


一般化ビュー


ASP.NET MVCには、汎用System.Web.Mvc.ViewPageクラスを使用してPageディレクティブのInherits属性を定義することにより、厳密に型指定されたビューを定義する機能があります。

例:

<%@ Page Inherits= "System.Web.Mvc.ViewPage<Object>" %>

コンパイラーがこのような構造を理解するには、Web.configでパーサーを定義する必要があります。

<pages pageParserFilterType= "System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" >
//...
<pages>


今のところすべてです。


MVCの内部構造(作業)をよりよく理解するために、最小限の要素セットでASP.NET MVCプロジェクトを手動で作成しました。
ソースはここからダウンロードできます

次回は、ASP.NET MVCでの作業に最適な原則と方法に関する記事を書く予定です。
継続するため。

PSああ、そうです、誰かが追加の招待を持っているなら、この記事の翻訳とデザインに携わった私の友人もハブに入りたいです
この記事は基礎として取り上げられました。

Source: https://habr.com/ru/post/J75346/


All Articles