我想将解决方案至少分为两部分:
因为我希望在开发过程的后期阶段可以替换托管配置。
我尝试将所有包含控制器,模型和视图的文件夹简单地移动到一个单独的项目中,如下图所示:
两个具有托管配置和业务逻辑分离的项目:
所以我
using Microsoft.AspNetCore.Mvc;
namespace MyApp.Implementation.Controllers
{
public class ExampleController : Controller
{
public ActionResult<int> Index()
{
return 5;
}
}
}
如果启动应用程序并在浏览器中打开http://localhost:5000/example,则在浏览器中得到结果“ 5”。这向我表明,托管技术可以在单独的项目中找到我的控制器。
但是,当我在浏览器中打开http://localhost:5000时,出现一个异常页面,告诉我找不到Home-Controller的视图。控制台还显示异常:
fail: Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[1]
An unhandled exception has occurred while executing the request.
System.InvalidOperationException: The view 'Index' was not found. The following locations were searched:
/Views/Home/Index.cshtml
/Views/Shared/Index.cshtml
/Pages/Shared/Index.cshtml
由于Web主机找到了我的控制器,所以我希望它也能找到视图。似乎并非如此。
如何告诉虚拟主机在哪里寻找视图呢?还是我需要对他们做任何事情?
答案 0 :(得分:6)
除了柯克·拉金(Kirk Larkin)评论Application Parts in ASP.NET Core的评论外,您可能还想看看Razor Class Libraries。
我还没有尝试过,但是看起来它可以为您的问题提供解决方案。
答案 1 :(得分:2)
移动控制器文件夹时出现的问题,它无法在Startup.cs
中检测到控制器。
其中应该有一行:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
根据this链接,您应该做的是为其添加一个名称空间,如下所示:
app.UseMvc(routes =>
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Foo", action = "Index", id = UrlParameter.Optional },
// This will prioritize routes within your main application
namespaces: new[] { "ProjectA.Controllers"}
);
});
希望这对您有用。