«Эту страницу не удалось найти на локальном хосте» - после добавления Area в ASP.NET MVC Core 2.2 - PullRequest
0 голосов
/ 04 октября 2019

Мой проект был перестроен в папки, называемые «областями», все работало раньше, и пользователь был авторизован в панели управления учетными записями. После добавления этих областей проект не может видеть, куда он должен идти.

Моя структура проекта:

enter image description here

Структура в области "Авторизоваться":

enter image description here

Я пытался работать с маршрутом для областей в Startup.cs:

...
            services.AddMvc( options =>
            options.EnableEndpointRouting = false)
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
...
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
                routes.MapAreaRoute(
                    name: "MyAreaAuthorize",
                    areaName: "Authorize",
                    template: "Authorize/{controller=Account}/{action=Index}/{id?}");
                routes.MapAreaRoute(
                    name: "MyAreaManage",
                    areaName: "Authorize",
                    template: "Authorize/{controller=Manage}/{action=Index}/{id?}");
                routes.MapAreaRoute(
                    name: "MyAreaAdminAccount",
                    areaName: "AdminAccount",
                    template: "AdminAccount/{controller=Admin}/{action=Index}/{id?}");
            });

Я также скопировал _ViewImports.cshtml для папок с представлениями для каждой области.

Мой файл выглядит следующим образом:

@using Example
@using Example.Models
@using Example.AccountArea.Models
@using Microsoft.AspNetCore.Identity
@addTagHelper Example.TagHelpers.*, Example
@addTagHelper Identity.TagHelpers.*, Identity
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

Просмотр в области «Авторизация» :

@using Example.AccountArea.Models;
@using Microsoft.AspNetCore.Identity;
@model Example.AccountArea.Models.AccountModel.LoginModel;
@inject SignInManager<UserApp> Sign
@{
    ViewData["Title"] = "Zaloguj się";
}

<form asp-area="Authorize" asp-controller="Account" asp-action="Login" method="post">
                <div asp-validation-summary="ModelOnly" class="text-danger"></div>
                <div>
                    <input asp-for="Email" placeholder="Email" />
                    <span asp-validation-for="Email" class="text-danger margin-text-form"></span>
                </div>
                <div>
                    <input asp-for="Password" placeholder="Hasło" />
                    <span asp-validation-for="Password" class="text-danger margin-text-form"></span>
                </div>
                <div class="group">
                    <div class="checkbox">
                        <input type='checkbox' id='my-checkbox'>
                        <label for='my-checkbox'>@Html.DisplayNameFor(m => m.RememberMe)</label>
                    </div>
                </div>
                <div class="form-group">
                    <button type="submit" class="btn-dark">Login</button>
                </div>
                <div class="group">
                    <p>
                        <a asp-area="Authorize" asp-controller="Account" asp-action="ForgotPassword">Forgot?</a>
                    </p>
                    <p>
                        <a asp-controller="Account" asp-action="Register">Register</a>
                    </p>
                </div>
            </form>
        </section>
</div>

@section Scripts {
    <partial name="_ValidationScriptsPartial" />
}

Учетная запись контроллера в области "Авторизация" :

Контроллер включил информацию для класса, который принадлежит области "Авторизация"

using System.Text.Encodings.Web;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.UI.Services;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Microsoft.AspNetCore.Authentication;
using System;
using Example.AccountArea.Models;
using Example.AccountArea.Models.AccountModel;

namespace Example.AccountArea.Controllers
{
    [Area("Authorize")]
    public class AccountController : Controller
    {
        ...My code is irrelevant to the problem...

        [HttpGet]
        [AllowAnonymous]
        public async Task<IActionResult> Login()
        {
            await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);
            return View();
        }

        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Login(LoginModel login)
        {
            if (ModelState.IsValid)
            {
                var result = await _signInManager.PasswordSignInAsync(login.Email, login.Password, login.RememberMe, false);
                if (result.Succeeded)
                {
                    _logger.LogInformation("...");
                    return RedirectToAction(nameof(ManageController.Index), "Manage");
                }
                if (result.IsLockedOut)
                {
                    _logger.LogWarning("...");
                    return RedirectToAction(nameof(LockoutOptions));
                }
                else
                {
                    ModelState.AddModelError(string.Empty, "...");
                    return View("../Home/Index");
                }
            }

            // If we got this far, something failed, redisplay form
            return View("../Home/Index", login);
        }

        ...My code is irrelevant to the problem...
    }
}

После запуска приложения мне отображается форма входа в систему, ссылки не работают, сообщение аналогично приведенному ниже, оно не проходит проверку данных и после нажатия кнопки «Войти»"он отображает:

enter image description here

Физический переход страниц в браузере:

Из логина :

enter image description here

Кому:

enter image description here

Пожалуйста, не сообщайте мне, что этоскопировано и есть похожие решения, потому что я сначала пытался найти решения в других похожих постах!

Есть идеи? Спасибо, если вы мне поможете ..

1 Ответ

1 голос
/ 05 октября 2019

У вас есть два маршрута для вашего Авторизации с разными контроллерами по умолчанию ... Я думаю, у вас должен быть только один. Не уверен, что в этом причина проблемы. Но я думаю, что это может привести к конфликту, это также выглядит излишним, потому что любые контроллеры в этой области будут включены по умолчанию с одним маршрутом.

Моя регистрация в области приложения aspnet core 2.2 выглядит следующим образом:

app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "Admin",
                template: "{area:exists}/{controller=Admin}/{action=Index}/{id?}");
...
...