【发布时间】:2018-03-24 00:27:23
【问题描述】:
我在 ASP.NET MVC Core 2 应用程序中配置默认主页时遇到了一些困难。我似乎无法将路由映射到正确的主页,默认情况下没有使用参数,例如。 https://localhost:44362
我不太喜欢将控制器放在控制器文件夹中、视图放在视图中、视图模型放在模型中的默认约定。我更喜欢按功能分组。
所以我有这样的结构:
Features
Home
HomeController.cs
HomeIndex.cshtml
HomeViewModel.cs
Other
OtherController.cs
OtherIndex.cshtml
OtherViewModel.cs
一切正常,除了在没有提供路径时我似乎无法将默认页面设置为 /Home/Index。当 HomeController 在 Controllers 中时一切正常(以及在 Views/Home 中的 Index),但是当我移动它时,事情就坏了。
我使用的是默认的 Startup.cs 文件,所以我有一个如下所示的 Configure 方法:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseBrowserLink();
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseAuthentication();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
我做了一些搜索,看起来在 ConfigureServices 方法中使用它应该可以工作:
services.AddMvc().AddRazorPagesOptions(options =>
{
options.Conventions.AddPageRoute("", "/Home/Index");
});
这会引发:Value cannot be null or empty (pageName) 异常。我还尝试了“/”、“/Home/Index”作为参数。最后,为了更好的衡量,我还交换了上面的参数,以防我误解了每个参数的用法。
在任何情况下,都不会显示任何页面。如果我输入完整的 URL /Home/Index,它就可以工作。我还尝试将 [Route("Home")] 属性附加到 HomeController 类,并将 [Route("Index")] 附加到操作方法。
所以我显然搞砸了路由,但我完全不清楚如何解决这个问题。我已经阅读并重新阅读了 Razor Pages 上的文档,但似乎并没有理清我的理解。
【问题讨论】:
-
那是因为你完全改变了应用程序的结构,现在没有
/Home/Index,有一个/Features/Home/Home/Index。这是一个非常糟糕的主意,IMO,你应该坚持 MVC 提供的东西。如果要对内容进行分组,请使用区域。此外,AddRazorPagesOptions用于您未使用的 ASP.NET Core Razor 页面,因此不会做任何有用的事情 -
MVC 遵循 convention over configuration 范式。该框架需要
Controllers和Views文件夹。将视图保存在 Views 文件夹中也可以提高部署效率——只需要复制 cshtml 文件。您可以查看Areas,这将为您提供一种对控制器进行分组的方法。
标签: c# asp.net-core