我正在尝试创建一个 Blazor 表单来更新 AppUser 的属性/设置,该 AppUser 继承自我的 Blazor webapp 中的默认 ASP.NET IdentityUser。为此,我尝试修改默认
我正在尝试创建一个 Blazor 表单来更新 AppUser 的属性/设置,该表单从我的 Blazor webapp 中的默认 ASP.NET IdentityUser 继承而来。为此,我正在尝试修改默认身份页面,具体来说 /Account/Manage
。默认页面可用于更改用户存储的电话号码。我想更改 AppUser 的一个属性 PageSize
。
@page "/Account/Manage"
@using System.ComponentModel.DataAnnotations
@using Microsoft.AspNetCore.Identity
@using MyApp.Data
@inject UserManager<AppUser> UserManager
@inject SignInManager<AppUser> SignInManager
@inject IdentityUserAccessor UserAccessor
@inject IdentityRedirectManager RedirectManager
<PageTitle>Profile</PageTitle>
<h3>Profile</h3>
<StatusMessage />
<div class="row">
<div class="col-md-6">
<EditForm Model="Input" FormName="profile" OnValidSubmit="OnValidSubmitAsync" method="post">
<DataAnnotationsValidator />
<ValidationSummary class="text-danger" role="alert" />
<div class="form-floating mb-3">
<input type="text" value="@username" class="form-control" placeholder="Please choose your username." disabled />
<label for="username" class="form-label">Username</label>
</div>
<div class="form-floating mb-3">
<InputNumber @bind-Value="Input.PageSize" class="form-control" placeholder="Number of rows in each page of data grid." />
<label for="page-size" class="form-label">Page size</label>
<ValidationMessage For="() => Input.PageSize" class="text-danger" />
</div>
<button type="submit" class="w-100 btn btn-lg btn-primary">Save</button>
</EditForm>
</div>
</div>
@code {
private AppUser user = default!;
private string? username;
private int pageSize;
[CascadingParameter]
private HttpContext HttpContext { get; set; } = default!;
[SupplyParameterFromForm]
private InputModel Input { get; set; } = new();
protected override async Task OnInitializedAsync()
{
user = await UserAccessor.GetRequiredUserAsync(HttpContext);
username = await UserManager.GetUserNameAsync(user);
pageSize = user.PageSize;
Input.PageSize = pageSize;
}
private async Task OnValidSubmitAsync()
{
if (Input.PageSize != pageSize)
{
user.PageSize = Input.PageSize;
var setPageSizeResult = await UserManager.UpdateAsync(user);
if (!setPageSizeResult.Succeeded)
{
RedirectManager.RedirectToCurrentPageWithStatus("Error: Failed to set page size.", HttpContext);
}
}
await SignInManager.RefreshSignInAsync(user);
RedirectManager.RedirectToCurrentPageWithStatus("Your profile has been updated", HttpContext);
}
private sealed class InputModel
{
[Display(Name = "Page size")]
[Range(1, int.MaxValue)]
public int PageSize { get; set; }
}
}
正如您所看到的,我只将代码行从 PhoneNumber
which was a string?
为 PageSize
which is an int。
表单加载正常,但未更新数据库中的数据。事实上, Input
中的对象 OnValidSubmitAsync
不包含表单中更新的数据。我从浏览器开发控制台检查过,确实 Input.PageSize
获得了 POSTed
,但后面的代码没有收到正确的值。
通过反复试验,我发现在其他地方更改 int
为必需的 int?
prop InputModel
可以使我的代码正常工作。但我不明白为什么。而且由于我也希望 bool
使用此表单更新属性,并且 Blazor InputCheckbox
组件无法处理可空布尔值,因此我需要上面的代码才能正常工作。
任何帮助都将非常感激。