c# - 如何在 ASP.NET Core MVC 2.0 的另一个程序集中使用前端控制器?
问题描述
我有一个 ASP.NET MVC 项目,我想从另一个程序集中添加一些图形前端页面。这个问题类似于这个问题:How to use a controller in another assembly in ASP.NET Core MVC 2.0?
我添加了建议的代码:
services.AddMvc().AddApplicationPart(assembly).AddControllersAsServices();
我添加了 Visual Studio 创建的示例 MVC 项目以及“HomeController”。并且调用了新的 HomeController 。(当我独立运行时,示例项目能够正常显示。)
但是当我通过我的主项目运行它时,它给出了以下异常:
处理请求时发生未处理的异常。InvalidOperationException:未找到视图“索引”。搜索了以下位置:
/Views/Home/Index.cshtml
/Views/Shared/Index.cshtml
/Pages/Shared/Index.cshtml
Microsoft.AspNetCore.Mvc.ViewEngines.ViewEngineResult.EnsureSuccessful(IEnumerable originalLocations)
找到并触发HomeController中的 Index 函数。(我可以在其中设置一个断点。)但似乎没有执行来自外部程序集的内部设置。(或其他东西。)第二个程序集的启动代码未执行。它应该,我猜?什么不见了?
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(o => o.AddPolicy("Local", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
}));
//...
services.AddSingleton<IDataviewer>(_dataviewer);
services.AddSingleton<IUserAccessManager>(_userAccessManager);
services.AddSingleton<ITokenLinkManager>(_tokenLinkManager);
services.AddSingleton<IEmailManager>(_emailManager);
services.AddMvc().AddApplicationPart(typeof(UserAdministration.Program).Assembly).AddControllersAsServices();
}
我的配置如下所示:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime appLifetime)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseCors("Local");
app.UseMvcWithDefaultRoute();
}
我认为我的其余代码不应该是相关的。(这是一个相当基础的项目。)
解决方案
我想我已经找到了一些答案。我可能必须在我的配置函数中添加类似这样的内容:
var embeddedFileProvider = new Microsoft.Extensions.FileProviders.EmbeddedFileProvider(
typeof(UserAdministration.Program).Assembly,
"UserAdministration.wwwroot"
);
app.UseStaticFiles(new StaticFileOptions{FileProvider = embeddedFileProvider });
这将告诉它在哪里获取静态文件。这要求静态文件已被吸入程序集中。这可以通过(程序集)csproj 文件中的以下条目来完成:
<ItemGroup>
<EmbeddedResource Include="wwwroot/**" />
</ItemGroup>
同样,您必须将以下内容添加到 ConfigureServices 函数中,以便它知道在哪里查找视图文件:
services.Configure<Microsoft.AspNetCore.Mvc.Razor.RazorViewEngineOptions>(options =>
{
options.FileProviders.Add(new Microsoft.Extensions.FileProviders.EmbeddedFileProvider(typeof(UserAdministration.Program).Assembly));
});
同样,这需要将视图文件吸入程序集中:
<ItemGroup>
<EmbeddedResource Include="Views/**/*.cshtml" />
</ItemGroup>
连同原来的补充:
services.AddMvc().AddApplicationPart(assembly).AddControllersAsServices();
......它似乎正在工作。
推荐阅读
- c - C - 将项目添加到数组
- bash - Bash 创建新目录并将每行的内容写入新目录中的文件
- python - 是否有一种 Python 的方式来引用 for 循环内的迭代器变量名称?
- javascript - 为什么 TextField 的 material-ui 'color' 属性有效,但 'borderColor' 无效?
- cakephp-3.0 - 如何在关联数据 CakePhp 3.x 中隐藏字段
- c# - Visual Studio 编辑器对多行 c# 注释的支持
- identityserver4 - Flurl 调用 IdentityServer4
- python - numpy 多个布尔索引数组
- arrays - NumPy 数组在分配/复制时丢失维度,为什么?
- javascript - “ i = (i + 1) % word.length ” 背后的逻辑是什么