2016-12-28 35 views
7

我想从我的小ASP.NET MVC 4应用程序切换到ASP.NET Core。ASP.NET Core中的Html.RenderAction的等效

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

@RenderSection("xyz", required: false) 

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

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

于是,我打电话控制器操作方法abc()来自Index。方法abc()传递一个模型对象并用该模型返回一个局部视图。 我不能使用RenderPartial,因为它需要传递一个模型。

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

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

+2

在ASP.NET核心'@ Html.Action'(我知道你在谈论RenderAction,但是我相信它遵循相同的概念)已被ViewComponents取代。看看:http://stackoverflow.com/questions/40341386/net-core-putting-views-into-a-tabs/40342752#40342752。问候。 – dime2lo

+0

感谢您的链接。我正在执行ViewComponents以查看是否与我的项目一起工作。 – user6542823

+0

这似乎很痛苦。也没有配置管理器。对于一个小应用程序需要做很多阅读。它可以被称为'与ASP.NET Core没有向后兼容性'吗? – user6542823

回答

8

我终于可以用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); 
     } 
    } 

然后,我创建下一个新的文件夹“MC”的视图,作为浏览/首页/组件/ MC/Default.cshtml

应当指出的是,视图名称是Default.cshtml,这就是它的工作原理。如果有人有更好的解决方案,请告诉我。

感谢您指点我ViewComponent的方向。

+1

我知道这真的很挑剔,但C#中的类名应该以大写字母开头,你的视图组件类应该是'AbcViewComponent',tableRowClass应该是'TableRowClass'以及context.tableRows应该是'context.TableRows'。否则,很高兴你有这个工作。 – akousmata

+1

谢谢。我有你说的名字,即从我的项目中的大写字母开始。这仅仅是我在这里提到的小案例。我将在未来发布时记住这一点。 – user6542823

0

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

0

只是针对上述问题后,它可能是更安全的传递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); 
    } 
} 
相关问题