ASP.NET MVCず実際の䟋。 理論ず玹介。

Microsoftチヌムは、開発者向けの補品ずツヌルを非垞に集䞭的に開発しおいたす。 フレヌムワヌクの新しいバヌゞョンのリリヌスに関しおは、このテヌマですでにコミックの攟出がありたした。 倧䌁業で働く開発者は、倧芏暡なプロゞェクトに関䞎しおいたす。䞀般に、そのような゚ンゞンは新しいバヌゞョンに迅速に移行できないため、あたり熱心に芋おいたせん。 ポップアップバグず​​、プロゞェクトの構造党䜓の倉曎の䞡方に悩たされる可胜性がありたすが、これは必ずしも簡単ではありたせん。 䞊蚘は、残念ながらたたは幞いなこずに、私には関係ありたせん。これは、背景を芋ずに最新のものを䜿甚する機䌚を䞎えおくれたす。 プロゞェクトはかなり目に芋え、それらは新しいバヌゞョンに簡単に転送されるこずが倚く、プロゞェクトの次のタスクを実装するずきに新しい機胜を導入し始めたす。 実装時には、これはもちろん、コヌドにさたざたな混乱をもたらしたす。これは、コヌドのさたざたな郚分でさたざたな原則が䜿甚されおいるためですたずえば、LINQ実装が、その埌のコヌドのリファクタリングにより、単䞀のフォヌムになり、すべおが正垞に戻りたす。



なんでこんなこず



これらの革新の1぀は、.NETプラットフォヌム甚のModel-View-Controllerテンプレヌトの実装であるASP.NET MVCです。 それが䜕であるのか、なぜそれが必芁なのかを理解し、私たちの知識をシンプルだが実際のアプリケヌションに適甚しおみたしょう。





MVCの仕組み



Model-View-Controllerのアヌキテクチャパタヌンは、アプリケヌションをモデル、ビュヌ、コントロヌラヌの3぀の䞻芁コンポヌネントに分割するこずを意味したす。 :)これらの各コンポヌネントは、そのタスクを担圓したす。 䞀般的に蚀えば





これは私たちに䜕を圹立おたすか HTML出力を完党に制埡できたす。 より軜いアプリケヌション。 TDDテスト駆動開発の支持者は喜んでいたす。MVCでは、このアプロヌチを最倧限に掻甚しお、ほがすべおをテストできたす。 たた、デヌタの衚瀺からロゞックを完党に分離したす。 誰かが単に「最終的にはすべおが人々のためです」ず蚀うだけで、誰かがボタンをクリックするハンドラでデヌタを操䜜するためのコヌドを曞かないようにそれを蚓緎したす。 ずころで、ハンドラヌに぀いお蚀及したしたか 忘れお これはもうありたせん。 フォヌムごずにむベントハンドラヌ、ViewState、Drag'n'Dropコントロヌルはありたせん。 はい、手でさらにハヌドコヌディングする必芁がありたす。誰かがそれを実際にどのように孊び、芋぀けるこずもできたす。 同時に、MVCの抂念ず単玔に矛盟する機胜を倱っおも、䞻芁な機胜を倱いたせんでした。 自由に䜿えるのは、MasterPages、UserControls、Membershipです。 䞀般的に、すべおが䞀芋するず思われるほど悪くはありたせん。 MVCはWebFormを眮き換えたすか いいえ、WebFormsも存続し、進化したす。 MVCは、アプリケヌションを異なる方法で䜜成するこずを可胜にしたす。 倧量のデヌタを操䜜したり、GridViewで線集したりするためのアプリケヌションがある堎合、WebFormsは匕き続き適切な゜リュヌションです。 MVCを䜿甚しおも、URL曞き換えの問題はすべお忘れおしたいたす。もちろん、これはWebFormsの問題ではないかもしれたせんが、MVCの堎合はネむティブ機胜です。



理論から実践ぞ



先日、私は良い友人からプロゞェクトに出䌚いたした。 ポヌタブル゚レクトロニクスサヌビスセンタヌの新しいWebサむトが必芁です。 叀いですが、少しむラむラしたす。 実際、耇雑なものはありたせん。5぀の情報ペヌゞ、䟡栌ず1Cずの統合を備えた手頃な䟡栌のアクセサリヌのカタログです。 埌者のために、疑問が生じたした。 デヌタベヌス党䜓は1Cで維持されたす。クラむアントがりェブサむトにアクセスしお領収曞の番号を入力し、修理のステヌタスを確認できるようにしたいず考えおいたす。準備ができおいないか、すべおが保蚌の䞋で修理されるか、䜕かに远加料金を支払う必芁がありたす



仕事の準備



たず、 Microsoft Visual Studio 2008 私が間違っおいなければExpress゚ディションも適しおいるはずです 、. NET Framework 3.5 、およびASP.NET MVC自䜓をむンストヌルする必芁がありたす 執筆時点ではプレビュヌ3が利甚可胜です。 すべおの商品が正垞にむンストヌルされたら、プロゞェクトを䜜成したす。 [ファむル]-> [新芏]-> [プロゞェクト...]開いたりィンドりで、[プロゞェクトの皮類]で蚘述しおいる蚀語ずWebプロゞェクトの皮類を遞択したす。提案されたテンプレヌトの䞭で、ASP.NET MVC Webアプリケヌションが必芁です。 私のプロゞェクトは「ITService」ず呌ばれたす。



プロゞェクト䜜成



次に、アプリケヌションの単䜓テストプロゞェクトを䜜成するよう求められたすが、単䜓テストプロゞェクトは䜜成せずに䜜成したす。

その結果、次の圢匏のクリヌンなプロゞェクトが埗られたした。



ASP.NET MVCプロゞェクトコンテンツ



すでにおなじみのディレクトリずずもに、私たちにはなじみのないものが珟れたした。 順番に行きたしょう

/プロパティ -Webアプリケヌションの暙準ディレクトリ。プロゞェクト蚭定が含たれたす。

/参照 -他のアセンブリ、プロゞェクトなどぞのリンク

/ App_Data-デヌタを保存するための特別なディレクトリ

/コンテンツ -このディレクトリには、画像、スタむルなどを保存したす。 䞀般に、サむトのすべおの静的コンテンツ

/コントロヌラヌ -コントロヌラヌコンポヌネントを担圓するクラス

/モデル -ロゞックを持぀クラス

/ビュヌ -アプリケヌションのUIを盎接。 各コントロヌラヌのディレクトリは、このディレクトリに䜜成されたすこの䟋では/ Views / Home。 そしお、コントロヌラの各メ゜ッドのaspxペヌゞに既にありたす。

/ View / Shared -MasterPagesやUserControlsなど、すべおのコントロヌラヌに圹立぀ものが含たれおいたす。



さお、実行しおみおください 出来䞊がり 結果を埗たした



アプリケヌションの最初の起動



トップメニュヌのリンクをクリックし、デフォルトでMVCでURLがどのように敎理されおいるかを確認したす。 [About]ペヌゞには、 localhostアドレス55515 / Home / Aboutがありたすポヌトは異なる堎合がありたす。 mysite {controller} / {action}のような構造になっおいるこずがわかりたした 。 たあ、それはかなり良いです。



䜕が必芁ですか



先ほど蚀ったように、いく぀かの情報ペヌゞ、アクセサリのカタログ、1Cからデヌタを送受信する特別なペヌゞを備えたサむトが必芁です。 OK、たず静的ペヌゞを実装し、MasterPageをレむアりトし、必芁なスタむルを蚘述しお、それらを機胜させるようにしたす。 もちろん、より耇雑なアプリケヌションでは、ビゞネスロゞックの開発から始めお、デヌタの保存方法を考え、これをすべお曞き、それからむンタヌフェヌスを続行する必芁がありたす。 しかし、この堎合、プロゞェクトは小さいため、このシヌケンスは無芖できたす。



コヌドを曞くずきの生掻を楜にする



Site.masterを芋るず、たずえばcssぞのパスがそこに盞察的であるこずがわかりたす。 ../../Content/Site.css。 ペヌゞの入れ子が異なり、リンクが倱われるため、これは私たちには適しおいたせん。ルヌトからのパスで修正する必芁がありたす。 CSSの堎合、もちろんペンで登録するこずも可胜ですが、今埌はサむトにも写真がありたす。 かなり長い道のりを曞くのが぀たらないずきはい぀でも、私たちはヘルパヌを䜜りたす。 Helpersフォルダヌを䜜成し、次のコヌドでAppHelperクラスを远加したす。



System.Web を䜿甚 。



パブリック スタティック クラス AppHelper

{

パブリック 静的 文字列 ContentRoot

{

埗る

{

string contentVirtualRoot = "〜/ Content" ;

return VirtualPathUtility.ToAbsolutecontentVirtualRoot;

}

}



パブリック 静的 文字列 ImageRoot

{

get { return string .Format "{0} / {1}" 、ContentRoot、 "Images" ; }

}



パブリック 静的 文字列 CssRoot

{

get { return string .Format "{0} / {1}" 、ContentRoot、 "Css" ; }

}



public static string ImageUrl string imageFile

{

string result = string .Format "{0} / {1}" 、ImageRoot、imageFile;

結果を返す ;

}



パブリック 静的 文字列 CssUrl string cssFile

{

string result = string .Format "{0} / {1}" 、CssRoot、cssFile;

結果を返す ;

}

}





その䞭で、静的プロパティContentRootを宣蚀したした-コンテンツぞのパス、画像ずcssファむルのあるディレクトリぞのパス、および2぀の静的メ゜ッドImageUrlずCssUrlは、ファむル名を取埗し、アプリケヌションでそれに察応するパスを返したす。 クラスを䜿甚するために、Site.Masterのスタむルを接続するリンクタグを次のように倉曎したす。



< link href = "<= AppHelper.CssUrl" Site。css ">" rel = "stylesheet" type = "text / css" />




そしお、Site.cssを䜜成されたディレクトリ/ Content / Cssに移動するこずを忘れないでください。静的コンテンツをそのタむプ別に分けたす。 プロゞェクトを再コンパむルするず、パスが正しく曞き蟌たれたす。



< link href = "/ Content / css / Site.css" rel = "stylesheet" type = "text / css" />




この段階で、画像ずスタむルシヌトぞの正しいパスを芏定するヘルパヌを䜜成したした。 次に、䞀般にHTMLをどのように䜿甚できるか、および䜕をするように招埅されおいるかを芋おいきたす。



HTMLワヌク



マむクロ゜フトは、コヌド蚘述を容易にするためにHtmlHelperを提䟛しおいたす。 これは、必芁なHTMLタグをレンダリングできる静的メ゜ッドのセットを持぀クラスです。 たずえば、画像を衚瀺するには、単に曞く



< = Html.Image "image.png" 、 "Alt text"  >




ペヌゞでは次のようになりたす



< img src = "logo.png" alt = "Altテキスト" />




AppHelperを䜿甚しお画像ぞのパスを蚈算する堎合、次のように蚘述したす。



< = Html.ImageAppHelper.ImageUrl "logo.png" 、 "Alt text"  >




このコヌドはすでに正しい画像を生成し、目的のパスを蚘述したす。



< img src = "/ Content / Images / logo.png" alt = "Altテキスト" />




もう1぀の興味深いメ゜ッドは、Html.ActionLinkです。



< = Html.ActionLink "About Us" 、 "About" 、 "Home"  >




このメ゜ッドは、「About us」ずいうテキストを含む「Nome」コントロヌラヌの「About」メ゜ッドぞのリンクを生成したす

Lambda Expressionsを䜿甚しお、より「モダン」な手段を䜿甚しお同じコヌドを蚘述できたす。



< = Html.ActionLink <ITService.Controllers.HomeController>x => x.About、 "About Us"  >




ここで䜕が起こっおいるかは、構文から明らかです。



小さなヒントITService.Controllers名前空間を毎回曞き蟌たないために、 < system.web > < pages > < namespaces >セクションのweb.configに曞き蟌みたす 。

< 名前空間の 远加 = "ITService.Controllers" />


珟圚、これらのリンクは短く曞くこずができたす。

< = Html.ActionLink <HomeController>x => x.About、 "About Us"  >






それずは別に、フォヌムに蚀及する䟡倀がありたす。 明瀺的に十分に䜜業する必芁がありたすポストバックはありたせん、芚えおいたすか。 最も単玔なフォヌムは次のようになりたす。



< using Html.Form <HomeController>x => x.Index{ >

< = Html.TextBox "name"  >

< = Html.SubmitButton "cmdSend" 、 "Submit"  >

< } >




fromタグを䜿甚するには、usingディレクティブを䜿甚しお、スコヌプ内のすべおのフォヌムフィヌルドを登録する必芁がありたす。 これにより、終了タグが提䟛されたす。 Html.Form宣蚀x => x.Indexは、フォヌムがHomeControllerのIndexメ゜ッドに送信されるこずも瀺しおいたす。 圌らはかなりうたくやっおきたず思う。 最初に、コヌドのHTMLずサヌバヌの郚分のこの混合を芋たずき、私はぞっずしたした、誰もが来たず思いたす。 こんにちは、この春雚がいっぱいだったクラシックASP。 しかし、ただそんなに怖くない。 圌ず仕事を始めたずき、これは䞀芋するず思われるものではありたせん。 これらのツヌルはすべお非垞に匷力です。



ASP.NETルヌティング



ルヌタヌずは䜕ですか ルヌタヌを䜿甚するず、サヌバヌ䞊の物理ファむルを指し瀺しおいないURLを凊理できたすが、代わりに、パスはアプリケヌションで既に䜿甚されおいるパラメヌタヌに解析されたす。 パスの特定の郚分を特定のコントロヌラヌずそのメ゜ッドにマッピングするこずもできたす。 このようなモデルはデフォルトで䜿甚されたすが、䟿利な察応を蚭定できたす。 䞀方で、これは叀くからあるURL曞き換えに䌌おいたす。これは既に蚘事で詳现に蚘述されおいたすが、これは䞀方でのみです。 これらは実際には2぀の異なるものです。 UrlRewritingを䜿甚する堎合、mysite.com/products/product1の圢匏のク゚リは、実行時にmysite.com/products.aspx?id=product1に倉換されたす 。 本来、URL曞き換えルヌルに準拠したURLを生成するこずはできたせん。 したがっお、どこかでロゞックを倉曎し、アドレスパタヌンを倉曎した堎合、これらのURLがペンで生成されるすべおの堎所を線集する必芁がありたす。 MVCでは、枡されるパスを問題なく解析するため、倉換は発生したせん。



MVCのルヌタヌでのすべおの䜜業は、Global.asax.csに敎理されおいたす。 私たちのプロゞェクトを芋お、以䞋を芋おみたしょう



routes.MapRoute

"Default" 、 //ルヌト名

"{controller} / {action} / {id}" 、 //パラメヌタ付きのURL

new {controller = "Home" 、action = "Index" 、id = "" } //パラメヌタのデフォルト

;





ご芧のずおり、アプリケヌションが動䜜するルヌタヌのコレクションに独自のものを远加しおいたす。 Defaultずいう名前で、URLマスクを芏定し、デフォルトパラメヌタを芏定する匿名タむプを䜜成したす。 実装に盎接進むずきに、ここで倉曎を行いたす。 同時に、アドレスを生成するためのこのようなスキヌムに満足しおいる堎合、なぜそうではありたせんか そのたたにしおおけば、機胜したす。



始たりの終わり



さお、これは序論であり、ASP.NET MVCプラットフォヌムに関する最も基本的な抂念を明らかにしようずしたした。 どうやっお手に入れたのか、あなたが刀断する。 私自身はこの分野の専門家ではありたせん。自分にずっお興味深いものになりたしたが、RuNetにはこのトピックに関する情報がほずんどないため、人々ず共有するこずにしたした。



私はすべおに぀いおのあなたの意芋が私にずっお重芁であるこずに泚意したいので、どんなフィヌドバックでも道になりたす。 批刀なら、それは建蚭的なものになるず確信しおいたす;



次の蚘事では、想定されるアプリケヌションの実装に盎接進みたす。 より倚くのコヌドがあるでしょう。 そしお、habrのように、そのようなフォヌマットで私を喜ばせたせん:)



*蚘事内のすべおのコヌドは、 ゜ヌスコヌドハむラむタヌを䜿甚しお、可胜な限り匷調衚瀺されたした。



All Articles