Как я могу показать всплывающее сообщение после входа пользователя в систему? - PullRequest
0 голосов
/ 05 мая 2020

Я работаю над asp. net core mvc веб-сайтом для домашнего задания. Приложение использует сервер идентификации для входа в систему. Я пытаюсь показать всплывающее уведомление после того, как пользователь вводит правильные учетные данные и нажимает кнопку входа (что-то вроде javascript alert). Я создал логическое свойство внутри файла .cs, которое становится истинным, когда пользователь успешно входит в систему. В файл .cs html я добавил блок сценария, который содержит функцию, которая показывает предупреждение, когда логическое свойство правда. Проблема в том, что функция выполняется при создании страницы (в этот момент свойство имеет значение false), даже если я вызываю функцию при нажатии кнопки. Есть предложения, в которых может быть проблема?

Login.cshtml
@page
@model LoginModel

@{
    ViewData["Title"] = "Log in";
}

<div class="container w-50 text-center">
    <h1 class="display-4" style="margin-bottom: 80px;">@ViewData["Title"]</h1>
    <section>
        <form id="account" method="post">
            <h4>Use a local account to log in.</h4>
            <hr />
            <div asp-validation-summary="All" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="Input.Email"></label>
                <input asp-for="Input.Email" class="form-control" />
                <span asp-validation-for="Input.Email" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Input.Password"></label>
                <input asp-for="Input.Password" class="form-control" />
                <span asp-validation-for="Input.Password" class="text-danger"></span>
            </div>
            <div class="form-group">
                <div class="checkbox">
                    <label asp-for="Input.RememberMe">
                        <input asp-for="Input.RememberMe" />
                        @Html.DisplayNameFor(m => m.Input.RememberMe)
                    </label>
                </div>
            </div>
            <div class="form-group">
                <button onclick="showAlert()" type="submit" class="btn btn-primary">Log in</button>
            </div>
            <div class="form-group">
                <p>
                    <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
                </p>
            </div>
        </form>
    </section>
</div>
<script type="text/javascript">
    showAlert = function () {
        if (@LoginModel.alert) {
            alert("Logged in succesfully");
            @LoginModel.alert = false;
        }
    }
</script>

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

Login.cshtml.cs
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text.Encodings.Web;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using BookingApp.ApplicationLogic.DataModel;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.UI.Services;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;

namespace BookingApp.Areas.Identity.Pages.Account
{
    [AllowAnonymous]
    public class LoginModel : PageModel
    {
        private readonly UserManager<User> _userManager;
        private readonly SignInManager<User> _signInManager;
        private readonly ILogger<LoginModel> _logger;
        [BindProperty] static public bool alert { get; set; } = false;

        public LoginModel(SignInManager<User> signInManager,
            ILogger<LoginModel> logger,
            UserManager<User> userManager)
        {
            _userManager = userManager;
            _signInManager = signInManager;
            _logger = logger;
        }

        [BindProperty]
        public InputModel Input { get; set; }

        public IList<AuthenticationScheme> ExternalLogins { get; set; }

        public string ReturnUrl { get; set; }

        [TempData]
        public string ErrorMessage { get; set; }

        public class InputModel
        {
            [Required]
            [EmailAddress]
            public string Email { get; set; }

            [Required]
            [DataType(DataType.Password)]
            public string Password { get; set; }

            [Display(Name = "Remember me?")]
            public bool RememberMe { get; set; }
        }

        public async Task OnGetAsync(string returnUrl = null)
        {
            if (!string.IsNullOrEmpty(ErrorMessage))
            {
                ModelState.AddModelError(string.Empty, ErrorMessage);
            }

            returnUrl = returnUrl ?? Url.Content("~/");

            // Clear the existing external cookie to ensure a clean login process
            await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);

            ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();

            ReturnUrl = returnUrl;
        }

        public async Task<IActionResult> OnPostAsync(string returnUrl = null)
        {
            returnUrl = returnUrl ?? Url.Content("~/");

            if (ModelState.IsValid)
            {
                // This doesn't count login failures towards account lockout
                // To enable password failures to trigger account lockout, set lockoutOnFailure: true
                var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: false);
                if (result.Succeeded)
                {
                    alert = true;
                    _logger.LogInformation("User logged in.");
                    return LocalRedirect(returnUrl);
                }
                if (result.RequiresTwoFactor)
                {
                    return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = Input.RememberMe });
                }
                if (result.IsLockedOut)
                {
                    _logger.LogWarning("User account locked out.");
                    return RedirectToPage("./Lockout");
                }
                else
                {
                    ModelState.AddModelError(string.Empty, "Invalid login attempt.");
                    return Page();
                }
            }

            // If we got this far, something failed, redisplay form
            return Page();
        }
    }
}

1 Ответ

0 голосов
/ 05 мая 2020

Вы уверены, что @LoginModel.alert дает JS -булево значение? Потому что обычно этого не происходит при записи JS бритвой.

Если результат не совсем понимается как логическое значение Javascript на этом этапе, это «правдиво». Например, если он анализируется как строка, условие "истинно" для JS.

В JS Я всегда предлагаю проверять значения с помощью ===, просто чтобы быть на стороне типобезопасности . Например:

if (@Json.Encode(LoginModel.alert) === true) {
   // ...
}
...