如何在ASP.NET Core 2中设置默认主页?

5

我正在尝试在ASP.NET MVC Core 2应用程序中配置默认主页,但遇到了一些困难。似乎无法正确映射路由到没有使用参数的正确主页,默认情况下,如https://localhost:44362

我不太喜欢将控制器放在控制器文件夹中,视图放在Views中,而将视图模型放在Models中的默认约定。我更喜欢按功能分组。

因此,我的结构如下:

Features
   Home
      HomeController.cs
      HomeIndex.cshtml
      HomeViewModel.cs
   Other
      OtherController.cs
      OtherIndex.cshtml
      OtherViewModel.cs

除了在没有提供路径时似乎无法将默认页面设置为/Home/Index之外,一切都正常工作。当HomeController在Controllers中(并且Index在Views / Home中)时,一切都很好,但是当我移动它时,问题就出现了。

我正在使用默认的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");
});

那会抛出一个异常:“值不能为空或为空 (pageName)”。我还尝试了“/”、“/Home/Index”作为参数。最后,为了保证万无一失,我也交换了上述参数,以防我误解了每个参数的用法。
在每种情况下,都没有显示页面。如果我输入完整的URL /Home/Index,则可以正常工作。我还尝试为HomeController类附加[Route("Home")]属性,并为操作方法附加[Route("Index")]。
所以我显然搞乱了路由,但我不清楚如何解决这个问题。我已经反复阅读了有关Razor Pages的文档,但似乎并没有澄清我的理解。

这是因为你完全改变了应用程序的结构,现在没有 /Home/Index,而是 /Features/Home/Home/Index。在我看来,这是一个非常糟糕的想法,你应该坚持使用MVC提供的内容。如果你想要分组,可以使用区域(areas)。另外,AddRazorPagesOptions 是用于 ASP.NET Core Razor Pages 的,而你并未使用它,所以这不会有任何有用的效果。 - Camilo Terevinto
MVC遵循“约定优于配置”的范例。框架期望那些ControllersViews文件夹存在。将视图保留在Views文件夹中还可以使部署更加高效--只需要复制cshtml文件即可。您可以查看Areas,这将为您提供一种分组控制器的方法。 - Jasen
2个回答

5

@paul-mrozowski,你在上面的解决方案中几乎是正确的。 对于基本页面,您需要使用以下方法来更改默认路由,前提是您的Index页面位于/Pages/Home/目录下:

services.AddMvc().AddRazorPagesOptions(options =>
{
    options.Conventions.AddPageRoute("/Home/Index", "");
});

如果有人正在使用Areas,一种方法是类似的,只要您的Index页面位于/Areas/SomeArea/Pages/目录下:

services.AddMvc().AddRazorPagesOptions(options =>
{
    options.Conventions.AddAreaPageRoute("SomeArea", "/Index", "");
});

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接