Код: Выделить всё
@page "/personaldata"
@attribute [Authorize]
@rendermode InteractiveServer
@using Microsoft.AspNetCore.Identity
@using Microsoft.AspNetCore.Components.Authorization
@using System.Security.Claims
@using System.ComponentModel.DataAnnotations
@using StudyHub.Data
@using StudyHub.Models
@using StudyHub.Components.Pages.Event
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.EntityFrameworkCore
@inject NavigationManager NavigationManager
@inject UserManager[url=paymenthistory]История оплат[/url]
[img]@(string.IsNullOrEmpty(UserData.Image) ? [/img]
[img]images/edit.svg[/img]
Изменить фото
Фамилия
Имя
Отчество
Дата рождения
Телефон
Пол
Выберите пол...
@if (UserData.Pols != null)
{
@foreach (var pol in UserData.Pols)
{
@pol.Name
}
}
Сохранить
.custom-file-upload {
display: flex;
align-items: center;
cursor: pointer;
}
.custom-file-upload img {
margin-right: 8px;
}
.file-input {
display: none;
}
@code {
public class UserDataModel
{
[Required(ErrorMessage = "Пожалуйста, введите фамилию.")]
[StringLength(100, MinimumLength = 2, ErrorMessage = "Фамилия должна содержать не менее 2 символов.")]
public string? LastName { get; set; }
[Required(ErrorMessage = "Пожалуйста, введите имя.")]
[StringLength(100, MinimumLength = 2, ErrorMessage = "Имя должно содержать не менее 2 символов.")]
public string? FirstName { get; set; }
[Required(ErrorMessage = "Пожалуйста, введите отчество.")]
[StringLength(100, MinimumLength = 2, ErrorMessage = "Отчество должно содержать не менее 2 символов.")]
public string? MiddleName { get; set; }
[Required(ErrorMessage = "Пожалуйста, введите дату рождения.")]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
[MaxDate(ErrorMessage = "Дата рождения не может быть в будущем.")]
public DateTime? DateBirth { get; set; }
[Required(ErrorMessage = "Пожалуйста, введите номер телефона.")]
[RegularExpression(@"^\+7 \d{3} \d{3} \d{2} \d{2}$", ErrorMessage = "Пожалуйста, введите корректный номер телефона в формате +7 XXX XXX XX XX.")]
public string? PhoneNumber { get; set; }
public string? Image { get; set; }
[Required(ErrorMessage = "Пожалуйста, выберите пол.")]
public int? PolId { get; set; }
public List
? Pols { get; set; }
}
public class MaxDateAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (value is DateTime date)
{
if (date > DateTime.Now)
{
return new ValidationResult(ErrorMessage);
}
}
return ValidationResult.Success;
}
}
private UserDataModel UserData { get; set; } = new UserDataModel();
protected override async Task OnInitializedAsync()
{
using var context = DbFactory.CreateDbContext();
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
var user = await UserManager.GetUserAsync(authState.User);
if (user != null)
{
UserData.LastName = user.LastName;
UserData.FirstName = user.FirstName;
UserData.MiddleName = user.MiddleName;
UserData.DateBirth = user.DateBirth;
UserData.Image = user.Image;
UserData.PolId = user.PolId;
UserData.PhoneNumber = user.PhoneNumber;
}
// Загрузка данных о поле из базы данных
UserData.Pols = await context.Pols.ToListAsync();
}
private async Task OnImageChange(InputFileChangeEventArgs e)
{
var file = e.File;
if (file != null)
{
using (var memoryStream = new MemoryStream())
{
await file.OpenReadStream().CopyToAsync(memoryStream);
UserData.Image = Convert.ToBase64String(memoryStream.ToArray());
}
}
}
private async Task SaveUserData()
{
using var context = DbFactory.CreateDbContext();
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
var user = await UserManager.GetUserAsync(authState.User);
if (user != null)
{
user.LastName = UserData.LastName;
user.FirstName = UserData.FirstName;
user.MiddleName = UserData.MiddleName;
user.DateBirth = UserData.DateBirth;
user.Image = UserData.Image;
user.PolId = UserData.PolId;
user.PhoneNumber = UserData.PhoneNumber;
var result = await UserManager.UpdateAsync(user);
if (result.Succeeded)
{
UserImageUpdated.RaiseUserImageUpdated(UserData.Image);
NavigationManager.NavigateTo("/personaldata");
}
}
}
private async Task GetUserDataAsync()
{
using var context = DbFactory.CreateDbContext();
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
var user = await UserManager.GetUserAsync(authState.User);
if (user != null)
{
var userData = new UserDataModel
{
LastName = user.LastName,
FirstName = user.FirstName,
MiddleName = user.MiddleName,
DateBirth = user.DateBirth,
Image = user.Image,
PolId = user.PolId,
PhoneNumber = user.PhoneNumber,
Pols = await context.Pols.ToListAsync()
};
return userData;
}
return null; // or handle accordingly
}
}
< /code>
Component Code Register.razor: < /p>
@page "/Account/Register"
@using System.ComponentModel.DataAnnotations
@using System.Text
@using System.Text.Encodings.Web
@using Microsoft.AspNetCore.Identity
@using Microsoft.AspNetCore.WebUtilities
@using StudyHub.Data
@using StudyHub.Models
@inject UserManager[url=Account/Login]
Войти
[/url]
.input-field > input {
box-sizing: border-box;
padding: 15px 20px;
width: 360px;
border-radius: 24px;
margin-top: 8px;
border: 1px solid #09213D;
color: #09213D;
font-family: "Montserrat", sans-serif;
font-optical-sizing: auto;
font-weight: 400;
font-style: normal;
font-size: 16px;
}
@code {
private IEnumerable? identityErrors;
[SupplyParameterFromForm]
private InputModel Input { get; set; } = new();
[SupplyParameterFromQuery]
private string? ReturnUrl { get; set; }
private ApplicationDbContext regcontext = default!;
public List[url=@(NavigationManager.GetUriWithQueryParameters(] { ["ReturnUrl"] = ReturnUrl }))">
Зарегистрироваться
[/url]
.input-field > input {
box-sizing: border-box;
padding: 15px 20px;
width: 360px;
border-radius: 24px;
margin-top: 8px;
border: 1px solid #09213D;
color: #09213D;
font-family: "Montserrat", sans-serif;
font-optical-sizing: auto;
font-weight: 400;
font-style: normal;
font-size: 16px;
}
@code {
private string? errorMessage;
[CascadingParameter]
private HttpContext HttpContext { get; set; } = default!;
[SupplyParameterFromForm]
private InputModel Input { get; set; } = new();
[SupplyParameterFromQuery]
private string? ReturnUrl { get; set; }
protected override async Task OnInitializedAsync()
{
if (HttpMethods.IsGet(HttpContext.Request.Method))
{
// Clear the existing external cookie to ensure a clean login process
await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);
}
}
public async Task LoginUser()
{
var result = await SignInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
RedirectManager.RedirectTo(ReturnUrl);
}
else
{
errorMessage = "Неправильная почта или пароль";
}
}
private sealed class InputModel
{
[Required(ErrorMessage = "Пожалуйста, введите электронную почту.")]
[EmailAddress(ErrorMessage = "Пожалуйста, введите корректный адрес электронной почты.")]
public string Email { get; set; } = "";
[Required(ErrorMessage = "Пожалуйста, введите пароль.")]
[DataType(DataType.Password)]
public string Password { get; set; } = "";
public bool RememberMe { get; set; }
}
}
< /code>
Как часть моего обучения, я создал веб -приложения для онлайн -курсов на Blazor. При создании приложения я использовал шаблон Blazor Web App. Первоначально проблемы были с кнопками, которые не работали, но rendermode = Interactive Server
Затем возникли проблемы, как я понимаю, динамическое отображение страницы и ее нормальное рендеринг, но каким -то образом я исправил его. Конфликты возникают, когда контекст снова доступен, насколько я понимаю. То есть после регистрации у вас нет возможности изменить данные пользователя, так как ошибка вызвана после сохранения данных пользователя, иногда ошибка была обращена вспять, регистрация не работала после изменения данных, недавно я заметил, что разрешение может добавить такую ошибку, как это: < /p>
не может привести к тому, что он возникает в обработке запроса. /> InvalidoperationException: Вторая операция была начата в этом экземпляре контекста до завершения предыдущей операции. Обычно это вызвано различными потоками одновременно с использованием одного и того же экземпляра DBContext. Для получения дополнительной информации о том, как избежать проблем с потоком с DBContext, см. Https://go.microsoft.com/fwlink/?linkid ... 3.образное. /> InvalidoperationException: Вторая операция была начата в этом экземпляре контекста до завершения предыдущей операции. Обычно это вызвано различными потоками одновременно с использованием одного и того же экземпляра DBContext. Для получения дополнительной информации о том, как избежать проблем с потоком с DBContext, см. /> microsoft.entityframeworkcore.query.internal.singlequeryingEnumerable+Asyncenumerator.movenextasync()
system.runtime.compilerservices.configuredvaluetaskawaitable+configuredvaluetaskawaiter.gretresultakawaitabaitabaitable+configuredValU /> microsoft.entityframeworkcore.query.shapedQueryCompilingExpressionVisitor.singleordefaultAsync(iaSyncenumerable Asyncenumerable, CancellationToken TancellationToken)
microsoft.entityframeworkcore.query.shapedQueryCompilingExpressionVisitor.singleordefaultAsync(iasyncenumerable asyncenumerable, DecellationToken CancellationToken) PersonalData.razor < /p>
var user = await usermanager.getuserasync (authstate.user); < /p>
p> microsoft.aspnetcore.components.componentbase.runinitandparametersasync разработа /> microsoft.aspnetcore.components.rendering.componentState.supplyCombinedParameters(ParameterView DirectAndCascadingParameters)
microsoft.aspnetcore.components.rendering.componentState.setDirectPparameters разработа. />microsoft.aspnetcore.components.rendertree.rendertreediffbuilder.initializenewComponentFrame(Ref diffContext diffContext, int frameIndex)
microsoft.aspnetcore.components.rendertree.rendertreediffbuilder.initializenewseRseConeStereftreeLeeSteRelectreeSteerTectReeReeSteReeReftreeSteRelectreeSteReEnteRele diffcontext, int frameIndex)
microsoft.aspnetcore.components.rendertree.rendertreediffbuilder.insertnewframe(Ref diffContext diffContext, int newFrameIndex)
microsoft.aspnetcore.components.rendertree.rendertreediffbuilder.appenddiffentriesforrange(Ref diffContext diffContext, int oldStartIndex, int illendIndexcl, int newStartIndex, int newendIndexcl)
microsoft.aspnetcore.components.rendering.componentstate.renderintobatch(renderbatchbuilder batchbuilder, renderfragment renderfragment, out исключение renderfragmentException)
microsoft.aspnetcore.components.renderTree.renderer.processRoceReue.> />Microsoft.AspNetCore.Components.RenderTree.Renderer.ProcessRenderQueue()
Microsoft.AspNetCore.Components.ComponentBase.StateHasChanged()
Microsoft.AspNetCore.Components.ComponentBase.CallOnParametersSetAsync()
microsoft.aspnetcore.components.componentbase.runinitandSetparametersAsync()
microsoft.aspnetcore.components.rendering.componentState.supplycombinedparameters(parameterview. /> microsoft.aspnetcore.components.rendering.componentState.setDirectParameters(ParameterView Параметры)
microsoft.aspnetcore.components.rendertree.render.renderrootcomponentasync componentid, parameterview)
renderrootcomponentasync разработа. /> microsoft.aspnetcore.components.htmlrendering.infrastructure.statichtmlrenderer.beginrenderingComponent( Тогкомпонент компонент, ParameterView initialParameters)
microsoft.aspnetcore.components.endpoints.endpointhtmlrenderer.renderendpointcomponent(httpcontext httpcontext, type rootcomponenttype, параметры parameterview, bool waitforquiescence)
ystem.thread.trearshal />
microsoft.aspnetcore.components.endpoints.razorcomponentendpointinvoker.rendercomponentcore(httpcontext context)
microsoft.aspnetcore.components.endpoints.razorcomponentendpointinvokencoker.rendercome. /> microsoft.aspnetcore.components.rendering.renderersynchronization context+c+Д.movenext()
microsoft.aspnetcore.authorization.authorizationmiddle.invoke(httpcontext) /> microsoft.aspnetcore.authentication.authenticationmiddleware.invoke(httpcontext context)
microsoft.aspnetcore.diagnostics.developerexceptionpagemiddlewareimpl.invoke(httpcontext. так что все работает правильно, спасибо заранее.
Подробнее здесь: https://stackoverflow.com/questions/796 ... tion-and-m