Я создаю простую форму входа. при нажатии кнопки эта функция запускается:
public async Task<IActionResult> OnPostButton_Login(IFormCollection data)
{
var emailAddress = Request.Form["emailaddress"];
var pass = Request.Form["password"];
if (String.IsNullOrEmpty(emailAddress)) return Page();
if (String.IsNullOrEmpty(pass)) return Page();
await GetUser(emailAddress , pass);
return Page();
}
Если пользователь ничего не вводит ни под адресом электронной почты, ни под паролем, страница перезагружается, но также очищает все входные данные.
Как я могу вернуться из этой функции, но оставить все нетронутым (и просто вернуть предупреждение?)





Как я могу вернуться из этой функции, но оставить все нетронутым (и просто вернуть предупреждение?)
Добавьте атрибут [BindProperty] к свойствам, которые вы хотите перезагрузить на возвращенную страницу.
[BindProperty]
public string emailaddress { get; set; }
[BindProperty]
public string password { get; set; }
Используйте метод ModelState.AddModelError, чтобы добавить строковое предупреждение/сообщение на возвращаемую страницу.
ModelState.AddModelError(string.Empty, "My message: Please provide an email address.");
Вот урезанная версия страницы входа с использованием вашего кода:
Логин.cshtml.cs
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace WebApplication1.Areas.Identity.Pages.Account
{
public class LoginModel : PageModel
{
[BindProperty]
public string emailaddress { get; set; }
[BindProperty]
public string password { get; set; }
public async Task OnGetAsync(string returnUrl = null)
{
await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);
}
public async Task<IActionResult> OnPostButton_Login(IFormCollection data)
{
string emailAddress = Request.Form["emailaddress"].ToString();
string pass = Request.Form["password"].ToString();
if (String.IsNullOrEmpty(emailAddress))
{
ModelState.AddModelError(string.Empty, "My message: Please provide an email address.");
return Page();
}
if (String.IsNullOrEmpty(pass))
{
ModelState.AddModelError(string.Empty, "My message: Please provide a password.");
return Page();
}
await GetUser(emailAddress, pass);
return Page();
}
private Task GetUser(string emailAddress, string pass)
{
throw new NotImplementedException();
}
}
}
Логин.cshtml
@page
@model LoginModel
@{
ViewData["Title"] = "Log in";
}
<h1>@ViewData["Title"]</h1>
<div class = "col-md-4">
<section>
<form id = "account" method = "post">
<div asp-validation-summary = "ModelOnly" class = "text-danger"></div>
<div class = "form-floating">
<input asp-for = "emailaddress" class = "form-control" autocomplete = "username" aria-required = "true" />
<label asp-for = "emailaddress" class = "form-label"></label>
<span asp-validation-for = "emailaddress" class = "text-danger"></span>
</div>
<div class = "form-floating">
<input asp-for = "password" class = "form-control" autocomplete = "current-password" aria-required = "true" />
<label asp-for = "password" class = "form-label"></label>
<span asp-validation-for = "password" class = "text-danger"></span>
</div>
<div>
<input type = "submit" value = "Submit" asp-page-handler = "Button_Login" />
</div>
</form>
</section>
</div>
Вот полный список того, что может быть возвращено методом post на странице Razor. Вы можете контролировать процесс отправки с помощью JavaScript на клиенте и с помощью fetch API.
Вы можете отправить сообщение в OnPostButton_Login, а затем вернуться с результатом контента (например, return Content("This is a message."); в обратный вызов Promise метода fetch. В этом процессе ваша страница не перезагружается, а публикуются только входные значения в форме. Вот ТАК сообщение о контроле процесса отправки.