我正在尝试从我的小型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助手(虽然我没有看到任何)?
答案 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()