2016-12-28 56 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); 
    } 
} 
相關問題