【问题标题】:How do I set a default home page in ASP.NET Core 2?如何在 ASP.NET Core 2 中设置默认主页?
【发布时间】: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 范式。该框架需要ControllersViews 文件夹。将视图保存在 Views 文件夹中也可以提高部署效率——只需要复制 cshtml 文件。您可以查看Areas,这将为您提供一种对控制器进行分组的方法。

标签: c# asp.net-core


【解决方案1】:

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

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

以防万一有人使用区域,方法类似,前提是您的 Index 页面位于 /Areas/SomeArea/Pages/ 目录下:

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

【讨论】:

    【解决方案2】:

    看来我需要做的只是调整 Razor 视图引擎在 Startup.cs 中的位置

    How to specify the view location

    在这篇博文中:

    Feature Folder Structure in ASP.NET Core

    然后我只需要删除我在测试期间添加的 Route 属性,它就开始工作了。

    【讨论】:

      猜你喜欢
      • 2020-06-14
      • 2021-12-29
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      相关资源
      最近更新 更多