【问题标题】:ASP.NET Core adding Area to form post without specifyingASP.NET Core 添加区域以形成帖子而不指定
【发布时间】:2020-12-25 00:27:04
【问题描述】:

所以问题是这样的,我有一个顶部导航栏,上面有一个这样的注销链接

<ul class="navbar-nav ml-auto">
                @if (signInManager.IsSignedIn(User))
                {
                    <li class="nav-item">
                        <form method="post" asp-controller="account" asp-action="logout">
                            <button type="submit" style="width:auto"
                                    class="nav-link btn btn-link py-0">
                                Logout @User.Identity.Name
                            </button>
                        </form>
                    </li>
                }

                else
                {
                    <li class="nav-item">
                        <a class="nav-link" asp-controller="account" asp-action="register"> Register</a>
                    </li>
                }
            </ul>

我的项目还包括区域,所以我有 2 个区域经纪人/客户:

使用代理登录后,注销的表单操作将修改为此

action: /Broker/account/logout,这会导致问题,因为我的 Broker 区域没有那个控制器

问题:为什么它没有显示 /account/logout 操作,就像我的表单“发布”代码中所述: form method="post" asp-controller="account" asp-action="logout"

Account Controller 没有在任何区域定义,它属于默认的 Controllers 文件夹,如图所示,AccountController / Logout 操作只会重定向到 HomeController / Index 操作。

请帮助我理解:D

编辑:我的路由:

app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
               name: "default",
               pattern: "{area:exists}/{controller=Account}/{action=Login}/{id?}");

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

【问题讨论】:

  • 1) 你的路由配置是什么? 2)您的 AccountController 中有标签 [Area("Broker")] 吗? 3)你的重定向代码是什么? 4)您所在区域是否定义了任何控制器?
  • 2) 您的 AccountController 中有标签 [Area("Broker")] 吗? = "Broker" 标签存在于 Broker/HomeController 中,AccountController 是独立的,它不属于任何区域 3) 你的重定向代码是什么? : 没有定义任何东西 4) 你有在你的区域定义的任何控制器吗?是的,有 Broker/Controllers/HomeController 用我的路由更新了帖子
  • 我看到的第一个问题是您不能定义 2 条具有相同名称的路由。大写有关系吗? asp-controller="Account" asp-action="Logout" asp-area=""
  • 因为您没有在表单标签中定义 asp-area,它可能会采用在您当前路由中找到的那个(并且因为您在 /broker 上,所以将选择默认区域)。尝试设置一个空的asp-area

标签: c# asp.net asp.net-core model-view-controller


【解决方案1】:

解释:

  • 您在 /broker/home 上登录,因此您的路由是 /broker/home/index
  • 然后您在不指定默认区域的情况下呈现菜单(然后在评估标签时默认设置为“代理”)。
  • 代理区域存在,因此您的第一条路线已匹配。

因此,您可以在表单标签中将 asp-area 设置为空字符串 (因为菜单可以呈现在现有区域中也可以不呈现)

【讨论】:

    【解决方案2】:

    找到解决办法,在我的AccountController中,不属于任何区域,使用路由属性[Route("/Account/Logout")],这样表单post动作就正确生成了

     [HttpPost]
        [Route("/Account/Logout")]
        public async Task<IActionResult> Logout()
        {
            await _signInManager.SignOutAsync();
            return RedirectToAction("login", "account");
        }
    

    所以 html 保持不变

     <ul class="navbar-nav ml-auto">
                    @if (signInManager.IsSignedIn(User))
                    {
                        <li class="nav-item">
                            <form method="post" asp-controller="account" asp-action="logout">
                                <button type="submit" style="width:auto"
                                        class="nav-link btn btn-link py-0">
                                    Logout @User.Identity.Name
                                </button>
                            </form>
                        </li>
                    }
    
                    else
                    {
                        <li class="nav-item">
                            <a class="nav-link" asp-controller="account" asp-action="register"> Register</a>
                        </li>
                    }
                </ul>
    

    【讨论】:

    • 很高兴您找到了解决方案。也许考虑在控制器范围内设置 [Route("/Account")],然后在必要时覆盖方法范围内的路由以避免一些重复!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    相关资源
    最近更新 更多