2

我正在爲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" 

回答

0

我能夠通過從外部解決方案生成並安裝一個NuGet包到消費解決方案中,從而從外部解決方案中獲得一個ViewComponent。我原本試圖在沒有創建自己的NuGet包的情況下添加對dll的引用,但它不起作用。

我建議先嚐試NuGet包。如果它仍然不起作用,你可以發佈兩個項目,以便我可以幫助調試嗎?

+0

它會幫助這個答案給出生成和安裝NuGet包的說明嗎? – Gary99

+0

我以某種方式設法讓它工作。但是對於你所要求的只是確保你的ViewComponent所在的外部程序集是一個ASP.NET Core項目。點擊項目屬性,然後在Package選項卡上,檢查第一個Build NuGet Package選項。成功構建後,.nupkg將位於您的bin \ Release或bin \ Debug文件夾中。複製到您自己的存儲庫並從那裏安裝。我添加了一個構建任務來自動將構建的NuGet包部署到我自己的NuGet(本地)存儲庫中。 –

+0

這就是我做NuGet包的原因。如果你能夠將它作爲一個DLL參考工作,你做了什麼不同?當我將它作爲一個dll包含在包中時,我一直在獲取視圖組件無法找到的錯誤。 –

相關問題