ASP.NET MVCでのビュー生成インスタンス解析
4420 ワード
本論文の例はASP.を分析した.NET MVCのビュー生成プロセス.皆さんの参考にしてください.具体的には以下の通りです.
ASP.NET MVCでは,フロントエンドのプレゼンテーションを3つの独立した部分に分けて実現し,Controllerはユーザの操作を制御し,Viewはプレゼンテーションの内容を制御し,Modelは処理したデータを表す.
コントローラからビューへ
通常、Controllerでは複数のActionを定義し、各Actionの戻りタイプは一般的にActionResultであり、Action処理の最後にビューに対する呼び出しを返します.
デフォルトでは、アクションと同じ名前のビューが呼び出されます.たとえば、上のアクションではIndexというビューが使用されます.
文字列パラメータを渡すと、この文字列はビューの名前として返されます.たとえば、IndexViewという名前のビューを使用してレンダリングしたい場合は、次のようにできます.
レイアウトとビュー
MVCは直接私たちのビューを探しに行きますか?まさか!Actionから戻ると、まずMVCはViewsフォルダの下に_という名前があるかどうかを確認します.ViewStart.cshtmlの特殊なファイルは、存在する場合は、このファイルを実行します.デフォルトでは、このファイルの内容は次のようになります.
つまり、デフォルトのレイアウトでそのファイルファイルを使用するように設定されています.
レイアウトは、WebFormで使用しているマスターページと同じです.
このファイルがない場合、デフォルトではレイアウトは使用されません.
もしこのファイルがあって、私たちがページの中でこのレイアウトを使いたくないならどうしますか?簡単で、ページにLayout=nullを設定して上書きします.
レイアウト内のパーティション
レイアウトページでは、デフォルトでは特殊なコマンド@RenderBody()が存在します.これは、コンテンツページに表示されているコンテンツが、ここで出力されるということです.これがレイアウトを使用すると、ビューにマークが付いていない理由がわかります.
たとえば、スタイルシートは通常タグにあり、現代のスクリプトはページの最後に表示され、ページの内容はもちろんページの本体に表示されます.これにより,コンテンツページの実際のコンテンツは,同じ位置で提示するのではなく,レイアウトの異なる部分で提示する必要がある.
解決策はパーティション化であり,実際にはWebFormのContentPlaceHolderと同様に名前付き領域を定義する.
たとえば、以下ではscriptsという名前の名前の領域を定義します.2番目のパラメータは、コンテンツページでコンテンツを提供することなく、この領域がオプションの領域であることを示します.
コンテンツビューでは、デフォルトのすべてのコンテンツがレイアウトページのRenderBodyセクションに埋め込まれます.
そうでなければ、コンテンツページで、@section領域名{}で対応する領域に出力する準備をしているコンテンツを定義できます.
セクションビュー
ページが複雑な場合、同じビューで出力の内容を定義すると、ページが非常に複雑になります.ページを複数の比較的独立した構成部分に分割することで、複雑なページを複数のサブ部分に分割して表示できます.例えば、ページのタイトル部分、ページのメニュー、ページの脚注部分などです.WebFormでは、この問題を解決する技術をユーザコントロールと呼び、MVCでは、分割ビューとサブアクションの2つの技術によって解決される.まず、セクションビューを見てください.セクションビューはActionに依存せず、他の独立したビューに埋め込まれて使用できます.ビューフォルダに直接セクションビューを作成できます.分割ビューを使用するページで、RenderPartialメソッドを使用して分割ビューを呼び出します.
分割ビューは、モデル、ViewData、ViewBagなど、すべてのデータをプライマリビューと共有し、分割ビューで直接使用できます.
分割ビューで異なるモデルオブジェクトを使用する場合は、分割ビューのデータの複雑さを簡略化し、モデルオブジェクトを直接渡すこともできます.
ここで2番目のパラメータは、モデルオブジェクトとして分割ビューで使用されます.
RenderPartialメソッドの戻りタイプはvoidであり、出力された内容が応答する出力ストリームに直接出力されることに注意してください.したがって、上記の文を使用する場合、ページに直接埋め込むことはできません.以下に示すように、1つの@{}文に置く必要があります.
このような文法が好きではなく、ページに直接埋め込む場合は、Htmlを使用することもできます.Partialメソッドは、出力ストリームに直接出力するのではなく、提示されたHtmlフラグメントを返すことを区別して提示される.
サブアクション問題
分散ビューには処理能力がないため、ホームページのデータを継承して提示するしかありませんが、処理能力が必要な場合はどうすればいいですか?WebFormでは、サーバを使用できます.Executeは他のプロセッサの出力内容を埋め込み,MVCではサブアクションを用いて処理する.サブActionとは,ユーザが直接アクセスできず,他のActionでしかアクセスできないActionメソッドであり,通常のActionと同様にActionメソッドがあり,このActionに対応するビューがある.特性ChildActionOnlyを用いて,これがサブActionであることを説明した.
ユーザがこのサブActionを直接要求すると、エラーメッセージが返されます.
操作「menu」は、サブリクエストからのみアクセスできます.
他のビューでは、RenderActionを使用してサブActionにアクセスできます.このメソッドは、RenderPartialメソッドと同様に、コンテンツを出力ストリームに直接出力します.戻りタイプはvoidなので、@{}を使用して使用する必要があります.
同様に、Actionを使用すると、Htmlフラグメントを直接返すことができ、@{}を使用する必要はありません.
皆さんのaspについてお話ししたいと思います.Netプログラミングが役立ちます.
ASP.NET MVCでは,フロントエンドのプレゼンテーションを3つの独立した部分に分けて実現し,Controllerはユーザの操作を制御し,Viewはプレゼンテーションの内容を制御し,Modelは処理したデータを表す.
コントローラからビューへ
通常、Controllerでは複数のActionを定義し、各Actionの戻りタイプは一般的にActionResultであり、Action処理の最後にビューに対する呼び出しを返します.
public ActionResult Index()
{
return this.View();
}
デフォルトでは、アクションと同じ名前のビューが呼び出されます.たとえば、上のアクションではIndexというビューが使用されます.
文字列パラメータを渡すと、この文字列はビューの名前として返されます.たとえば、IndexViewという名前のビューを使用してレンダリングしたい場合は、次のようにできます.
public ActionResult Index()
{
return this.View("IndexView");
}
レイアウトとビュー
MVCは直接私たちのビューを探しに行きますか?まさか!Actionから戻ると、まずMVCはViewsフォルダの下に_という名前があるかどうかを確認します.ViewStart.cshtmlの特殊なファイルは、存在する場合は、このファイルを実行します.デフォルトでは、このファイルの内容は次のようになります.
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
つまり、デフォルトのレイアウトでそのファイルファイルを使用するように設定されています.
レイアウトは、WebFormで使用しているマスターページと同じです.
このファイルがない場合、デフォルトではレイアウトは使用されません.
もしこのファイルがあって、私たちがページの中でこのレイアウトを使いたくないならどうしますか?簡単で、ページにLayout=nullを設定して上書きします.
@{
Layout = null;
}
レイアウト内のパーティション
レイアウトページでは、デフォルトでは特殊なコマンド@RenderBody()が存在します.これは、コンテンツページに表示されているコンテンツが、ここで出力されるということです.これがレイアウトを使用すると、ビューにマークが付いていない理由がわかります.
@RenderBody()
たとえば、スタイルシートは通常タグにあり、現代のスクリプトはページの最後に表示され、ページの内容はもちろんページの本体に表示されます.これにより,コンテンツページの実際のコンテンツは,同じ位置で提示するのではなく,レイアウトの異なる部分で提示する必要がある.
解決策はパーティション化であり,実際にはWebFormのContentPlaceHolderと同様に名前付き領域を定義する.
たとえば、以下ではscriptsという名前の名前の領域を定義します.2番目のパラメータは、コンテンツページでコンテンツを提供することなく、この領域がオプションの領域であることを示します.
@RenderBody()
@RenderSection("scripts", required: false)
コンテンツビューでは、デフォルトのすべてのコンテンツがレイアウトページのRenderBodyセクションに埋め込まれます.
そうでなければ、コンテンツページで、@section領域名{}で対応する領域に出力する準備をしているコンテンツを定義できます.
@section scripts{
<br> var i = 0;
<br>
}
セクションビュー
ページが複雑な場合、同じビューで出力の内容を定義すると、ページが非常に複雑になります.ページを複数の比較的独立した構成部分に分割することで、複雑なページを複数のサブ部分に分割して表示できます.例えば、ページのタイトル部分、ページのメニュー、ページの脚注部分などです.WebFormでは、この問題を解決する技術をユーザコントロールと呼び、MVCでは、分割ビューとサブアクションの2つの技術によって解決される.まず、セクションビューを見てください.セクションビューはActionに依存せず、他の独立したビューに埋め込まれて使用できます.ビューフォルダに直接セクションビューを作成できます.分割ビューを使用するページで、RenderPartialメソッドを使用して分割ビューを呼び出します.
Html.RenderPartial("ProductSummary");
分割ビューは、モデル、ViewData、ViewBagなど、すべてのデータをプライマリビューと共有し、分割ビューで直接使用できます.
分割ビューで異なるモデルオブジェクトを使用する場合は、分割ビューのデータの複雑さを簡略化し、モデルオブジェクトを直接渡すこともできます.
Html.RenderPartial("ProductSummary", p);
ここで2番目のパラメータは、モデルオブジェクトとして分割ビューで使用されます.
RenderPartialメソッドの戻りタイプはvoidであり、出力された内容が応答する出力ストリームに直接出力されることに注意してください.したがって、上記の文を使用する場合、ページに直接埋め込むことはできません.以下に示すように、1つの@{}文に置く必要があります.
@{
Html.RenderPartial("ProductSummary", p);
}
このような文法が好きではなく、ページに直接埋め込む場合は、Htmlを使用することもできます.Partialメソッドは、出力ストリームに直接出力するのではなく、提示されたHtmlフラグメントを返すことを区別して提示される.
@Html.Partial("ProductSummary", p)
サブアクション問題
分散ビューには処理能力がないため、ホームページのデータを継承して提示するしかありませんが、処理能力が必要な場合はどうすればいいですか?WebFormでは、サーバを使用できます.Executeは他のプロセッサの出力内容を埋め込み,MVCではサブアクションを用いて処理する.サブActionとは,ユーザが直接アクセスできず,他のActionでしかアクセスできないActionメソッドであり,通常のActionと同様にActionメソッドがあり,このActionに対応するビューがある.特性ChildActionOnlyを用いて,これがサブActionであることを説明した.
[ChildActionOnly]
public string Menu()
{
return "Hello, from NavController";
}
ユーザがこのサブActionを直接要求すると、エラーメッセージが返されます.
操作「menu」は、サブリクエストからのみアクセスできます.
他のビューでは、RenderActionを使用してサブActionにアクセスできます.このメソッドは、RenderPartialメソッドと同様に、コンテンツを出力ストリームに直接出力します.戻りタイプはvoidなので、@{}を使用して使用する必要があります.
@{ Html.RenderAction("Menu", "Nav"); }
同様に、Actionを使用すると、Htmlフラグメントを直接返すことができ、@{}を使用する必要はありません.
@Html.Action("Menu", "Nav")
皆さんのaspについてお話ししたいと思います.Netプログラミングが役立ちます.