ASPを解読する.NET 5&MVC 6シリーズチュートリアル(14):View Component
3648 ワード
以前のMVCでは、Web FormsのWebControlのような機能がMVCにはないため、Partial Viewを使用して実装される小さなコンポーネントのような機能が常に必要でした.しかしMVC 6では、この機能が大幅に改善された.新版MVC 6では、View Componentという機能を提供しています.
すべての応答ではなく、一部のコンテンツをレンダリングするminiのControllerと見なすことができます.すべてのPartial Viewで解決できる問題は、ダイナミックナビゲーションメニュー、Tagラベル、ログインウィンドウ、カート、最近の文章など、View Componentを使用して解決することができます.
View Componentには2つの部分があり、一部はクラス(View Componentに継承)で、もう1つはRazorビュー(通常のViewビューと同じ)です.新しいMVCのControllerのように、View ComponentはPOCOの(つまりView Componentクラスを継承しないが、クラス名はView Componentで終わる)を使用することもできます.
View Componentの作成
現在、View Componentクラスの作成方法は次の3つです.
View Componentに直接継承クラスにView Componentプロパティを追加するか、View Componentプロパティを持つクラスに継承してクラスを作成します.クラス名はView Componentで終わります.
Controllerと同様に、View Componentはpublicでなければなりません.ネストできません.抽象クラスではありません.
たとえば、TopListView Componentというクラス名のView Componentを作成します.コードは次のとおりです.
上記のクラスは、以下のように定義することもできる.
TopWidgetクラスでTopListという名前のViewComponentプロパティを定義することにより、その効果はTopListViewComponentクラスを定義するのと同様に、システムは検索時に認められ、そのコンストラクタで注入機能に依存してコンストラクタ内のパラメータを提示するクラス型インスタンスである.
Invoke法は任意の数のパラメータを伝達できる約束法であり,システムもInvokeAsync法の非同期機能を実現することをサポートする.
View Componentのビューファイル作成
その後、
さらにView Componentでビューの名前が指定されていない場合は、デフォルトで
これで、このView Componentは作成され、ViewsProductindexで作成できます.cshtmlビューの任意の場所でViewComponentを呼び出します.たとえば、次のようにします.
上記TopListView Componentで非同期メソッドInvokeAsyncが定義されている場合、
注意:一般的には、ViewComponentのビューファイルは、ViewsSharedフォルダに追加されます.一般的には、ViewComponentはコントローラに固有ではありません.
カスタムビューファイルの使用
一般に、カスタムファイルを使用する場合は、Invokeメソッドが戻り値を返すときにビューの名前を指定する必要があります.例は次のとおりです.
では、
まとめ
一般的には、すべてのビューファイルを
すべての応答ではなく、一部のコンテンツをレンダリングするminiのControllerと見なすことができます.すべてのPartial Viewで解決できる問題は、ダイナミックナビゲーションメニュー、Tagラベル、ログインウィンドウ、カート、最近の文章など、View Componentを使用して解決することができます.
View Componentには2つの部分があり、一部はクラス(View Componentに継承)で、もう1つはRazorビュー(通常のViewビューと同じ)です.新しいMVCのControllerのように、View ComponentはPOCOの(つまりView Componentクラスを継承しないが、クラス名はView Componentで終わる)を使用することもできます.
View Componentの作成
現在、View Componentクラスの作成方法は次の3つです.
View Componentに直接継承クラスにView Componentプロパティを追加するか、View Componentプロパティを持つクラスに継承してクラスを作成します.クラス名はView Componentで終わります.
Controllerと同様に、View Componentはpublicでなければなりません.ネストできません.抽象クラスではありません.
たとえば、TopListView Componentというクラス名のView Componentを作成します.コードは次のとおりです.
public class TopListViewComponent : ViewComponent
{
private readonly ApplicationDbContext db;
public TopListViewComponent(ApplicationDbContext context)
{
db = context;
}
public IViewComponentResult Invoke(int categoryId, int topN)
{
List col = new List();
var items = db.TodoItems.Where(x => x.IsDone == false &&
x.categoryId == categoryId).Take(topN);
return View(items);
}
}
上記のクラスは、以下のように定義することもできる.
[ViewComponent(Name = "TopList")]
public class TopWidget
{
//
}
TopWidgetクラスでTopListという名前のViewComponentプロパティを定義することにより、その効果はTopListViewComponentクラスを定義するのと同様に、システムは検索時に認められ、そのコンストラクタで注入機能に依存してコンストラクタ内のパラメータを提示するクラス型インスタンスである.
Invoke法は任意の数のパラメータを伝達できる約束法であり,システムもInvokeAsync法の非同期機能を実現することをサポートする.
View Componentのビューファイル作成
ProductController
のビューでView Componentを呼び出す場合、Views\Product
フォルダの下にComponents
という名前のフォルダを作成する必要があります(このフォルダ名はComponents
でなければなりません).その後、
Views\Product\Components
フォルダの下にTopList
という名前のフォルダを作成します(このフォルダ名はView Component名と一致する必要があります.つまり、TopList
でなければなりません).Views\Product\Components\TopList
フォルダの下に、Default.cshtml
ビューファイルを作成し、次のタグを追加します.
@model IEnumerable
Top Products
@foreach (var todo in Model)
{
- @todo.Title
}
さらにView Componentでビューの名前が指定されていない場合は、デフォルトで
Default.cshtml
ビューになります.これで、このView Componentは作成され、ViewsProductindexで作成できます.cshtmlビューの任意の場所でViewComponentを呼び出します.たとえば、次のようにします.
@Component.Invoke("TopList", 1, 10)
上記TopListView Componentで非同期メソッドInvokeAsyncが定義されている場合、
@await Component.InvokeAsync()
メソッドを使用して呼び出すことができます.この2つのメソッドの最初のパラメータはTopListView Componentの名前であり、残りのパラメータはTopListView Componentクラスで定義されたメソッドパラメータです.注意:一般的には、ViewComponentのビューファイルは、ViewsSharedフォルダに追加されます.一般的には、ViewComponentはコントローラに固有ではありません.
カスタムビューファイルの使用
一般に、カスタムファイルを使用する場合は、Invokeメソッドが戻り値を返すときにビューの名前を指定する必要があります.例は次のとおりです.
return View("TopN", items);
では、
Views\Product\Components\TopN.cshtml
ファイルを作成する必要がありますが、使用する場合は変更する必要はありません.元のView Component名を指定する必要があります.たとえば、次のようにします.
@await Component.InvokeAsync("TopList", 1, 10) //
まとめ
一般的には、すべてのビューファイルを
Views\Shared
フォルダに置くことができるように、共通の機能でView Componentの機能を使用することをお勧めします.