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

时间:2018-03-24 00:27:24

标签: c# asp.net-core

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

我真的不喜欢将控制器置于Controllers文件夹,视图中的视图和模型中的视图模型中的默认约定。我更喜欢按功能分组。

所以我有这样的结构:

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

一切正常,但是当没有提供路径时,我似乎无法将默认页面设置为/ Home / Index。当HomeController在Controllers(和视图/主页中的索引)中时,一切都有效,但是一旦我移动它,事情就会崩溃。

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

抛出a:值不能为null或为空(pageName)异常。我还尝试了“/”,“/ Home / Index”作为参数。最后,为了更好的衡量,我还交换了上述参数,以防万一我误解了每个参数的用法。

在每种情况下,都不会显示任何页面。如果我输入完整的URL / Home / Index,它就可以了。我还尝试将[Route(“Home”)]属性附加到HomeController类,并将[Route(“Index”)]附加到action方法。

所以我显然搞砸了路由,但我并不清楚如何解决这个问题。我已经阅读并重新阅读了Razor Pages上的文档,这些文档似乎没有让我理解。

2 个答案:

答案 0 :(得分:2)

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

How to specify the view location

在这篇博文中:

Feature Folder Structure in ASP.NET Core

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

答案 1 :(得分:2)

@ 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", "");
});