2017-09-26 11 views
0

私は簡単なCMSを使用してウェブサイトを構築し、自分のページに「コンポーネント」を注入する必要があります。現時点では、以下のような私はかなり簡単な方法でコンポーネントをレンダリングしています:TagHelperからコントローラアクションを呼び出す

<latest-blog-posts limit="3" order-by="date asc"/>

は、私は、実際のコンテンツを埋めるためにTagHelpersを使用します。 ASP.NET Coreでコントローラアクションを呼び出し、呼び出し元のタグを結果のビューに置き換える方法はありますか?私の気持ちは、output.WriteTo(TextWriter writer, HtmlEncoder encoder)を使って調べる必要があるということですが、私はアクションから作者への応答をどのようにフィードするのかとつきものです。

+0

なぜタグヘルパーからアクションメソッドを呼び出すのですか?あなたは何を達成しようとしていますか? – Shyju

+0

私がやろうとしていることは、自分の意見やモデルをできるだけシンプルにすることです。基本的なプロパティのコレクションを持つ_potential_コンポーネントのコレクションを受け取ります。私は上記のタグとしてこれらを簡単にレンダリングすることができますが、実際には各コンポーネントが複雑になる可能性があります。この例では、CMSを呼び出して最新の3つのブログ記事を取得する必要があります。私はバックエンドコードでHTMLを編集するという嫌な思いをしていますし、何らかの見方でコントローラ内の各コンポーネントを管理することで、アプリケーション全体で柔軟性と再利用性が向上すると判断しました。 – mnield

+0

タグヘルパーは、コンテンツをレンダリングするために使用する必要があります。部分的なビューと子のアクションを使って、あなたが望むものを達成できますか? – Fran

答えて

1

あなたはview componentsを探しています。それらは、MVC 5以前で動作していた子アクションと同じように機能します。

public class LatestBlogPostsViewComponent : ViewComponent 
{ 
    private readonly BlogDbContext db; 

    public LatestBlogPostsViewComponent(BlogDbContext context) 
    { 
     db = context; 
    } 

    public async Task<IViewComponentResult> InvokeAsync(int limit, string orderBy) 
    { 
     var posts = // get latest posts; 
     return View(posts); 
    } 
} 

次に、ビューViews/Shared/Components/LatestBlogPosts.cshtmlを作成し、最新のブログの記事のリストをレンダリングしたいコードを追加します。ビューのモデルは、ビューコンポーネントによって返されるpostsのタイプになります。

@await Component.InvokeAsync("LatestBlogPosts", new { limit = 3, orderBy = "date asc" }) 

それとも、あなたはTagHelper構文を好む場合:

<vc:latest-blog-posts limit="3" orderBy="date asc"></vc:latest-blog-posts> 

あなたがレンダリングされる最新のブログの記事は、コンポーネントが使用して呼び出したいビューやレイアウトの最後に

、後者の方法では、あなたはregister the view component(s)が必要です。

関連する問題