ASP.NET 核心中 Html.RenderAction 的等价物

Equivalent of Html.RenderAction in ASP.NET Core

我正在尝试从我的小型 ASP.NET MVC 4 应用程序切换到 ASP.NET 核心。

在我的 MVC 4 应用程序中,我有一个使用 RenderSection 的布局文件:

@RenderSection("xyz", required: false)

然后,在我的索引文件中,我有:

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

因此,我正在从 Index 调用控制器操作方法 abc()。方法 abc() 传递模型对象和 returns 带有该模型的部分视图。 我无法使用 RenderPartial,因为它需要传递模型。

现在,在 ASP.NET Core 中,我没有 RenderAction() 方法。

我的问题是:如何从我的索引文件调用控制器操作方法?是否还有其他 HTML 助手(虽然我没有看到)?

.

我终于可以用 ViewComponent 来完成了。所以,我没有使用 RenderAction(),而是:

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

其中 abc 是一个 class 作为 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);
        }
    }

然后,我在新文件夹 'abc' 下创建了一个视图 Views/Home/Components/abc/Default.cshtml

请注意,视图名称是 Default.cshtml,这就是它的工作原理。如果谁有更好的解决办法,请告诉我。

感谢您为我指明 ViewComponent 的方向。

有一个解决方法,您可以使用 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()

只是为了完成上述问题,传递 ViewComponent class 的名称可能更安全,如下所示:

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

虽然通常使用 "Default" 作为结果视图,但您也可以 return 视图名称,如果它与默认值不同:

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);
    }
}