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

ASP.NET核心中Html.RenderAction的等价物,asp.net,asp.net-mvc,asp.net-core,renderaction,Asp.net,Asp.net Mvc,Asp.net Core,Renderaction,我正在尝试从我的小型ASP.NETMVC4应用程序切换到ASP.NETCore 在我的MVC 4应用程序中,我有一个布局文件,它使用RenderSection作为: @RenderSection("xyz", required: false) 然后,在我的索引文件中,我有: @section xyz{ @{Html.RenderAction("abc");} } 所以,我从索引调用控制器操作方法abc()。方法abc()传递一个模型对象并返回该模型的局部视图。 我不能

我正在尝试从我的小型ASP.NETMVC4应用程序切换到ASP.NETCore

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

@RenderSection("xyz", required: false)
然后,在我的索引文件中,我有:

@section xyz{
        @{Html.RenderAction("abc");}
    }
所以,我从索引调用控制器操作方法abc()。方法abc()传递一个模型对象并返回该模型的局部视图。 我不能使用RenderPartial,因为它需要传递一个模型

现在,在ASP.NET核心中,我没有RenderAction()方法

我的问题是:如何从索引文件调用控制器操作方法?是否有其他HTML帮助程序(尽管我没有看到)


.

我终于能够用ViewComponent完成这项工作。因此,我没有使用RenderAction(),而是:

其中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);
        }
    }
public类abcViewComponent:ViewComponent
{
private DbContextOptions db=new DbContextOptions();
公共异步任务InvokeAsync()
{
MyContext上下文=新的MyContext(db);
IEnumerable mc=wait context.tableRows.ToListSync();
返回视图(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>
景色

@model int

Controller中的值:@Model
仅为了完成上述问题,传递ViewComponent类的名称可能更安全,如下所示:

@section xyz{
    @await Component.InvokeAsync(nameof(yournamespace.abc))
}
虽然使用“Default”作为结果视图是很常见的,但如果与默认值不同,您也可以返回视图名称:

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);
    }
}
public类abcViewComponent:ViewComponent
{
private DbContextOptions db=new DbContextOptions();
公共异步任务InvokeAsync()
{
MyContext上下文=新的MyContext(db);
IEnumerable mc=wait context.tableRows.ToListSync();
返回视图(“YourViewName”,mc);
}
}

在ASP.NET Core
@Html.Action
中(我知道您在谈论渲染,但我相信它遵循相同的概念)已被ViewComponents取代。请看:。谢谢你的链接。我正在努力实现ViewComponents,看看这是否适合我的项目。这似乎很痛苦。也没有配置管理器。对于一个小应用程序,需要进行大量的阅读。它可以被称为“与ASP.NET核心没有向后兼容性”吗?ASP.NET核心是一种重写,保留了大多数但并非所有的概念。比viewcomponents更简单的是只使用局部视图。但是,如果它需要逻辑或与主视图不同的模型,比如控制器操作所处理的对象,那么ViewComponent就是要使用的东西。你可以分享控制器代码吗?我知道这很挑剔,但是C#中的类名应该以大写字母开头,因此视图组件类应该是
AbcViewComponent
,tableRowClass应该是
tableRowClass
以及context.tableRows应该是
context.tableRows
。否则,很高兴你能成功。谢谢。我有你所说的名字,即在我的项目中以大写字母开头。举个例子,我提到的是小案例。我将在以后发布时记住这一点。值得注意的是,对于ASP.NET Core 1.1及更高版本,您可以通过标记帮助程序调用视图组件:
()这与渲染不同,这是一种完全不同的方法。@PaulKnopf除了缺少[ChildActionOnly]支持外,还有什么特别不同的呢?这是关于mvc现在走向的最糟糕的事情之一。很好,但不是什么。这种方法在页面加载后而不是在加载期间呈现操作结果。此外,它确实需要JS,这可能不是大多数桌面浏览器所关心的问题,但在手机上可能会变得很有挑战性,特别是在低速和/或不稳定的连接上,但在使用异国浏览器的低级手机上也是如此。
@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);
    }
}