ASP.NET Core中Html.RenderAction的等价物

时间:2016-12-28 00:30:20

标签: asp.net asp.net-mvc asp.net-core 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助手(虽然我没有看到任何)?

3 个答案:

答案 0 :(得分:19)

我终于能够使用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);
        }
    }

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

需要注意的是,视图名称是Default.cshtml,这就是它的工作原理。如果有人有任何更好的解决方案,请告诉我。

感谢您将我指向ViewComponent。

答案 1 :(得分:5)

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

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

虽然通常使用&#34;默认&#34;作为结果视图,如果视图名称与默认名称不同,您还可以返回视图名称:

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

答案 2 :(得分:3)

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