我正在爲MVC .NET Core Web應用程序使用最新的VS.2017更新和模板。我決定在外部程序集中使用ViewComponents,因爲我閱讀了幾篇文章,指出不可能沒有奇怪的技巧。無法找到外部程序集中的ViewComponent
我有我的主要的Web應用程序,然後我創建了一個.NET Framework類庫命名MySite.Components這是「外部組件」。其中我安裝了ViewFeatures NuGet。我在它的/Views/Shared/Components/GoogleAdsense/Default.cshtml中創建了我的View組件CSHTML。
,我發現我的csproj已經有GoogleAdSense作爲嵌入資源:
<ItemGroup>
<None Include="app.config" />
<None Include="packages.config" />
<EmbeddedResource Include="Views\Shared\Components\GoogleAdsense\Default.cshtml" />
</ItemGroup>
視圖組件其實很簡單:
namespace MySite.Components.ViewComponents {
[ViewComponent(Name = "GoogleAdsense")]
public class GoogleAdsense : ViewComponent {
public async Task<IViewComponentResult> InvokeAsync(string adSlot, string clientId, string adStyle = "")
{
var model = await GetConfigAsync(adSlot, clientId, adStyle);
return View(model);
}
private Task<GoogleAdUnitCompModel> GetConfigAsync(string adSlot, string clientId, string adStyle)
{
GoogleAdUnitCompModel model = new GoogleAdUnitCompModel
{
ClientId = clientId, // apparently we can't access App_Data because there is no AppDomain in .NET core
SlotNr = adSlot,
Style = adStyle
};
return Task.FromResult(model);
}
}
}
然後在主項目(ASP。 NET Core web應用程序)我安裝了文件提供程序NuGet並修改了我的啓動:
services.Configure<RazorViewEngineOptions>(options =>
{
options.FileProviders.Add(new EmbeddedFileProvider(
typeof(MySite.Components.ViewComponents.GoogleAdsense).GetTypeInfo().Assembly,
"MySite.Components.ViewComponents"
));
});
然後我嘗試在這樣的視圖中使用的視圖組件:
@using MySite.Components.ViewComponents
:
@Component.InvokeAsync(nameof(GoogleAdsense), new { adSlot = "2700000000", clientId = "ca-pub-0000000000000000", adStyle="" })
我得到一個錯誤說
*InvalidOperationException: A view component named 'GoogleAdsense' could not be found.*
使用沒有nameof(符號也試過),它使用一個通用的參數InvokeAsync但也失敗了,但與
*"Argument 1: cannot convert from 'method group' to 'object'"*
並採用TagHelper形式簡單地呈現爲一個無法識別的HTML:
<vc:GoogleAdsense adSlot = "2700000000" clientId = "ca-pub-0000000000000000"></vc:GoogleAdsense>
最後,在主組件(實際的Web應用程序)我用外部裝配式的GetManifestResourceNames(),以驗證它是嵌入式和返回的清單有它列爲:
[0] = "MySite.Components.Views.Shared.Components.GoogleAdsense.Default.cshtml"
它會幫助這個答案給出生成和安裝NuGet包的說明嗎? – Gary99
我以某種方式設法讓它工作。但是對於你所要求的只是確保你的ViewComponent所在的外部程序集是一個ASP.NET Core項目。點擊項目屬性,然後在Package選項卡上,檢查第一個Build NuGet Package選項。成功構建後,.nupkg將位於您的bin \ Release或bin \ Debug文件夾中。複製到您自己的存儲庫並從那裏安裝。我添加了一個構建任務來自動將構建的NuGet包部署到我自己的NuGet(本地)存儲庫中。 –
這就是我做NuGet包的原因。如果你能夠將它作爲一個DLL參考工作,你做了什麼不同?當我將它作爲一個dll包含在包中時,我一直在獲取視圖組件無法找到的錯誤。 –