web-dev-qa-db-ja.com

ASP.NET CoreのHtml.RenderActionと同等

小さなASP.NET MVC 4アプリケーションからASP.NET Coreに切り替えようとしています。

MVC 4アプリケーションには、RenderSectionを次のように使用するレイアウトファイルがあります。

@RenderSection("xyz", required: false)

次に、私のインデックスファイルには、私が持っています:

@section xyz{
        @{Html.RenderAction("abc");}
    }

そのため、Indexからコントローラーアクションメソッドabc()を呼び出しています。メソッドabc()はモデルオブジェクトを渡し、そのモデルの部分ビューを返します。モデルを渡す必要があるため、RenderPartialを使用できません。

現在、ASP.NET Coreには、RenderAction()メソッドがありません。

私の質問は、インデックスファイルからコントローラーアクションメソッドをどのように呼び出すかです。そのための他のHTMLヘルパーはありますか(ただし、表示されません)。

16
user6542823

私はついにViewComponentでそれを行うことができました。だから、RenderAction()の代わりに、私はやった:

@section xyz{
        @await Component.InvokeAsync("abc")
    }

ここで、abcはabcViewComponentとしてのクラスです。 ViewComponentは次のようになります。

public class abcViewComponent : ViewComponent
    {
        private DbContextOptions<MyContext> db = new DbContextOptions<MyContext>();
        public async Task<IViewComponentResult> InvokeAsync()
        {
            MyContext context = new MyContext(db);
            IEnumerable<tableRowClass> mc = await context.tableRows.ToListAsync();
            return View(mc);
        }
    }

次に、Views/Home/Components/mc/Default.cshtmlとして新しいフォルダー「mc」の下にビューを作成しました

ビュー名はDefault.cshtmlであり、それがどのように機能するかに注意してください。誰かがより良い解決策を持っているなら、私に知らせてください。

ViewComponentの方向を教えてくれてありがとう。

20
user6542823

上記の質問を完了するために、おそらく次のようにViewComponentクラスの名前を渡す方が安全です。

@section xyz{
    @await Component.InvokeAsync(nameof(yournamespace.abc))
}

結果のビューとして「デフォルト」を使用するのが一般的ですが、デフォルトと異なる場合はビュー名を返すこともできます。

public class abcViewComponent : ViewComponent
{
    private DbContextOptions<MyContext> db = new DbContextOptions<MyContext>();
    public async Task<IViewComponentResult> InvokeAsync()
    {
        MyContext context = new MyContext(db);
        IEnumerable<tableRowClass> mc = await context.tableRows.ToListAsync();
        return View("YourViewName", mc);
    }
}
5
Nick Parker

回避策があります。Url.Action+ JQueryを使用してコンテンツをレンダリングできます。

アクションをレンダリングするビューは次のようになります。

<div id="dynamicContentContainer"></div>
<script>   
    $.get('@Url.Action("GetData", "Home")', {id : 1}, function(content){
            $("#dynamicContentContainer").html(content);
        });
</script>

ホームコントローラー:

[HttpGet]
public IActionResult GetData(int id)
{
   return PartialView(id);
}

景色

@model int 
<span>Values from controler :</span> @Model

リクエストをさらに制御したい場合は、ここで詳細情報を読むことができます: jQuery.get()

3
Kabindas