【问题标题】:asp.net mvc core 3.1 area based routingasp.net mvc core 3.1 基于区域的路由
【发布时间】:2021-01-13 16:47:00
【问题描述】:

我想在我的项目中包含基于区域的路由。我尝试了一些东西,但似乎没有任何意义

我在 Startup.cs 中有一个站点区域和以下路由

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapAreaControllerRoute(
                name: "Sites",
                areaName: "Sites",
                pattern: "Sites/{controller=Home}/{action=Index}/{id?}");


            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
        });

当尝试访问以下 url(如图中的项目设置)时,我被定向到 Home/Index,这是该区域外的默认映射。

但是,如果我创建一个默认主页控制器的链接

<a asp-action="Create" asp-controller="Home" asp-area="Sites">Create</a>

我正确地被重定向到区域控制器,但生成的 url 相当混乱

https://localhost:44379/Sites/Home/Index/sites/home/create

我在想以下 url 将重定向到基于 Url 的区域控制器站点。我错过了什么吗?

https://localhost:44379/Sites/Home/Index 

目录结构在这里表示。

【问题讨论】:

    标签: asp.net-core-mvc asp.net-core-3.1


    【解决方案1】:

    该问题与App URL和SSL URL有关(在Application Properties, Debug面板中),当使用Anchor Tag Helper生成URL时,它会将URL附加到App URL的末尾,因此会导致这种行为。

    要解决此问题,请将 App URL 从https://localhost:44379/Sites/Home/Index/ 更改为https://localhost:44379/

    在Properties文件夹中,打开launchSettings.json文件,修改内容如下:

    {
      "iisSettings": {
        "windowsAuthentication": false,
        "anonymousAuthentication": true,
        "iisExpress": {
          "applicationUrl": "http://localhost:64670",
          "sslPort": 44307
        }
      },
      "profiles": {
        "IIS Express": {
          "commandName": "IISExpress",
          "launchBrowser": true,
          "environmentVariables": {
            "ASPNETCORE_ENVIRONMENT": "Development"
          }
        },
        "WebApplication": {
          "commandName": "Project",
          "launchBrowser": true,
          "environmentVariables": {
            "ASPNETCORE_ENVIRONMENT": "Development"
          },
          "applicationUrl": "https://localhost:5001;http://localhost:5000"
        }
      }
    }
    

    根据您的代码,我尝试使用以下代码在站点区域中添加 HomeController:

    [Area("sites")]
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
        public IActionResult About()
        {
            return View();
        }
    }
    

    然后,使用以下代码添加超链接:

    <a class="nav-link text-dark" asp-area="Sites" asp-controller="Home" asp-action="Index">Sites Index</a>
    <br />
    <a class="nav-link text-dark" asp-area="Sites" asp-controller="Home" asp-action="About">Sites Home About</a>
    <br /> 
    <a href="/Sites/Home/index">Sites Index</a>
    

    App URL 如下:

    生成的 URL 如下(重定向后仍然使用正确的 URL):

    更新

    要将区域页面设置为起始页面,您可以在区域页面的操作方法中使用[Route] 属性。代码如下:

    HomeController.cs(在站点区域和控制器文件夹中)

    [Area("Sites")]
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
        [Route("")]
        [Route("Sites/Home/About")]
        public IActionResult About()
        {
            return View();
        }
    }
    

    [注意]应用属性中无需设置Launch browser、App URL或Enable SSL url。

    结果如下:在这个示例中,默认页面是关于页面,它不包含令人困惑的 URL。

    【讨论】:

    • 我试过这个,第一个问题,我误解了App Url。 App Url = Base Url .. 这是您正确突出显示的内容。当我在开发机器中运行应用程序时,如何将 Area->Controller->Action 设置为提供的页面。我尝试了您的示例,然后将 Sites/Home/Create 放在 LaunchBrowser 中,但默认主页仍然是启动时提供的主页
    • @user1131926,是的,你是对的,如果在LaunchBrowser中输入https://localhost:44307/Sites/Home/IndexSites/Home/Index,当我们使用Anchor Tag和asp-*添加链接时,重定向后也会生成一个像 https://localhost:44307/Sites/Home/Index/sites/home/create 这样令人困惑的 URL。但是,如果我们使用 &lt;a href="/Sites/Home/index"&gt;Sites Index&lt;/a&gt; 设置 Anchor 标签,则 URL 是正确的。因此,要生成正确的 url,您可以清除 LaunchBrowser 或为锚标记设置 href 属性。
    • 正确,但我需要做哪些更改才能将站点/主页/创建作为启动 URL 提供服务?
    • 嗨@user1131926,请查看我在回复中的更新。要将区域页面设置为起始页面,您可以在区域页面的操作方法中使用 [Route] 属性。无需在应用属性中设置 Launch browser、App URL 或 Enable SSL URL。
    • 我试过了,但似乎不起作用,我仍然得到默认页面作为启动。必须有一种简单的方法来更改启动页面。
    猜你喜欢
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 2018-08-28
    • 2017-12-30
    • 2020-10-31
    • 2010-12-09
    • 2018-05-31
    相关资源
    最近更新 更多