我们正在将应用程序从ASP.NET Core 2.2项目升级到使用EndPoint路由的ASP.NET 3.0。我陷入了以下“找不到网页”的问题。我相信我对ASP.NET 3.0应用了正确的更改,并且尝试了各种更改。
这是asp.net核心2.2代码区域
startup.cs
greater
我们用:装饰控制器
static inline int greater(int a, int b) { return a > b ? a : b; }
这是我们已更改的 asp.net 3.0代码区域
startup.cs
public void ConfigureServices(IServiceCollection services)
......
//Asp.net Core 2.2
services.AddRouting();
//AddMvc
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
.AddViewLocalization(
LanguageViewLocationExpanderFormat.Suffix, options => { options.ResourcesPath = "Areas\\Resources"; })
.AddDataAnnotationsLocalization();
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
.....
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
//
routes.MapRoute(name: "Navigation", template: "Navigation/{controller}/{action}/{id?}";
我的剃刀页面包括以下内容:
namespace Areas.Navigation.Controllers
{
[Area("Navigation")]
[Route("[area]/[controller]/[action]")]
public class NavigationHomeController : Controller
{.......
我遇到了以下问题
答案 0 :(得分:1)
此问题的解决方案是审查“从ASP.NET Core 2.2迁移到3.0”,最初是这样做的,但是忽略了本文档中的建议。
我的项目包含130个其他子项目。要解决我的问题,我需要执行以下操作:
在启动中删除对MapRoute的所有Core 2.2引用。例如:
routes.MapRoute(name: "Navigation", template:
Navigation/{controller}/{action}/{id?}";
使用"How to define an endpoint Route to multiple Areas"的建议
在启动中,代码如下所示:
app.UseEndpoints(endpoints =>
{
endpoints.MapAreaControllerRoute(
name: "areas",
areaName: "areas",
pattern: "{area}/{controller}/{action}/{id?}"
);
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");});
还有最后一个关键项目,直到我们修复和更新我们的代码。 “从控制器操作名称中删除异步后缀”
services.AddMvc(options =>options.SuppressAsyncSuffixInActionNames = false);
进行更改后,应用程序将按预期工作。
答案 1 :(得分:0)
通过使用Route
属性装饰您的控制器
[Area("Navigation")]
[Route("[area]/[controller]/[action]")] //<-- attribute routing
public class NavigationHomeController : Controller {
//...
控制器现在正在使用属性路由,而不是基于约定的路由。
但是,您没有在配置中启用属性路由。
在以下示例中:
MapControllers
添加了对属性路由控制器的支持。MapAreaControllerRoute
为区域中的控制器添加了常规路由。MapControllerRoute
为控制器添加了常规路由。
//...
app.UseEndpoints(endpoints => {
//Attribute routing
endpoints.MapControllers();
//Area convention-based routing
endpoints.MapAreaControllerRoute(
areaName: "Navigation",
name: "Navigation",
pattern: "Navigation/{controller}/{action}/{id?}");
//Convention-based routing
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
//...
这样做是为了避免在将请求匹配到已注册的路由时发生路由冲突。
在处理基于约定的路由时,注册顺序还对路由表如何解释请求起作用。
因此,请确保先注册特定路由,然后再注册更通用的路由。区域也应该在一般路线之前注册。