OnGet()
用来自UnapprovedApplications
的数据填充AspNetUsers
。
用户ID目前是正确的。
c4d69cbe-436e-4d74-bc7d-c4a99a8cbf34
e184da25-687b-4e51-9f1d-c3a93a732ec1
OnPostAsync()
,但是,将用户ID返回为
20b6af04-ecb5-49c0-b4e4-bdb172bd19c7
5a61fbce-4c69-4a15-be66-725c5ab4b884
为什么UnapprovedApplications
中的数据正在更改?
如何保持这些数据不变?
模型ReviewApplicationModel
如此构造
[BindProperty]
public IList<ApplicationUser> UnapprovedApplications { get; set; }
public void OnGet(string returnUrl = null)
{
ReturnUrl = returnUrl;
UnapprovedApplications = new List<ApplicationUser>();
foreach (var user in userManager.Users.Where(x => !x.Approved))
{
System.Diagnostics.Debug.WriteLine(user.Id);
UnapprovedApplications.Add(user);
}
}
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
foreach (var user in UnapprovedApplications)
System.Diagnostics.Debug.WriteLine(user.Id);
return RedirectToPage();
}
以
视图@page
@model ReviewApplicationsModel
@{
ViewData["Title"] = "Review Applications";
ViewData["ActivePage"] = ManageNavPages.ReviewApplications;
}
<h4>@ViewData["Title"]</h4>
<div class="row">
<div class="col-md-6">
<form asp-route-returnUrl="@Model.ReturnUrl" method="post">
<button type="submit" class="btn btn-primary">Approve Selected Applications</button>
<table class="table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(x => x.UnapprovedApplications.FirstOrDefault().Id)
</th>
<th>
@Html.DisplayNameFor(x => x.UnapprovedApplications.FirstOrDefault().Organization)
</th>
<th>
@Html.DisplayNameFor(x => x.UnapprovedApplications.FirstOrDefault().FEIEIN)
</th>
<th>
@Html.DisplayNameFor(x => x.UnapprovedApplications.FirstOrDefault().State)
</th>
<th>
@Html.DisplayNameFor(x => x.UnapprovedApplications.FirstOrDefault().PrincipalCity)
</th>
<th>
@Html.DisplayNameFor(x => x.UnapprovedApplications.FirstOrDefault().PhoneNumber)
</th>
<th>
Approved
</th>
<th></th>
</tr>
</thead>
<tbody>
@for (var i = 0; i < Model.UnapprovedApplications.Count(); i++)
{
<tr>
<td>@Model.UnapprovedApplications[i].Id</td>
<td>@Model.UnapprovedApplications[i].Organization</td>
<td>@Model.UnapprovedApplications[i].FEIEIN)</td>
<td>@Model.UnapprovedApplications[i].State</td>
<td>@Model.UnapprovedApplications[i].PrincipalCity</td>
<td>@Model.UnapprovedApplications[i].PhoneNumber</td>
<td>
<input asp-for="@Model.UnapprovedApplications[i].Approved" class="form-control" />
<span asp-validation-for="@Model.UnapprovedApplications[i].Approved" class="text-danger"></span>
</td>
</tr>
}
</tbody>
</table>
</form>
</div>
</div>
@section Scripts {
<partial name="_ValidationScriptsPartial" />
}
答案 0 :(得分:0)
这将是追求该线程解决方案的独白。
我发现IdentityUser具有生成Guid的默认构造函数。 发生的情况是客户端缺少模型数据,并且不同的用户ID也不同,因为正在生成模型数据时就好像它们是新用户一样。
我发现此信息由@ Forty-Two发布 Pass an entire model on form submission
该模型将全部传递给控制器,但是 不受输入或隐藏字段约束的属性的值将 迷路了。
您必须在客户端的表单中绑定属性, 或在服务器端重新获取实体。
您似乎在要求类似@ Html.HiddenFor(m => m.Model),这是不可能的。抱歉
请记住一件事,如果您有大量的隐藏字段,则可能 向视图发送比实际所需更多的数据。考虑 使用视图模型
GET
检索到的数据,以便可以按原计划通过POST
保存编辑的数据。好的,所以实际上我只是将必要的数据绑定在表格中,并且一切都按预期工作。
这是解决方案
[AllowAnonymous]
public class ReviewApplicationsModel : PageModel
{
readonly UserManager<ApplicationUser> userManager;
public ReviewApplicationsModel(UserManager<ApplicationUser> userManager)
{
this.userManager = userManager;
}
public string ReturnUrl { get; set; }
[BindProperty]
public ObservableCollection<ApplicationUser> UnapprovedApplications { get; set; }
public void OnGet(string returnUrl = null)
{
ReturnUrl = returnUrl;
UnapprovedApplications = new ObservableCollection<ApplicationUser>();
foreach (var user in userManager.Users.Where(x => !x.Approved))
UnapprovedApplications.Add(user);
}
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
ReturnUrl = returnUrl;
if (!ModelState.IsValid)
return Page();
foreach (var user in UnapprovedApplications.Where(x => x.Approved))
{
var tmp = await userManager.FindByIdAsync(user.Id);
tmp.Approved = true;
await userManager.UpdateAsync(tmp);
}
return RedirectToPage();
}
}
@page
@model ReviewApplicationsModel
@{
ViewData["Title"] = "Review Applications";
ViewData["ActivePage"] = ManageNavPages.ReviewApplications;
}
<h4>@ViewData["Title"]</h4>
<div class="row">
<form method="post">
<div class="col-md-auto">
<button type="submit" class="btn btn-primary">Approve Selected Applications</button>
<table class="table">
<thead>
<tr>
<th hidden>@Html.DisplayNameFor(x => x.UnapprovedApplications.FirstOrDefault().Id)</th>
<th>@Html.DisplayNameFor(x => x.UnapprovedApplications.FirstOrDefault().Organization)</th>
<th>@Html.DisplayNameFor(x => x.UnapprovedApplications.FirstOrDefault().FEIEIN)</th>
<th>@Html.DisplayNameFor(x => x.UnapprovedApplications.FirstOrDefault().State)</th>
<th>@Html.DisplayNameFor(x => x.UnapprovedApplications.FirstOrDefault().Approved)</th>
</tr>
</thead>
<tbody>
@for (var i = 0; i < Model.UnapprovedApplications.Count(); i++)
{
<tr>
<td hidden><input asp-for="UnapprovedApplications[i].Id" class="form-control" hidden /></td>
<td><input asp-for="UnapprovedApplications[i].Organization" class="form-control" disabled /></td>
<td><input asp-for="UnapprovedApplications[i].FEIEIN" class="form-control" disabled /></td>
<td><input asp-for="UnapprovedApplications[i].State" class="form-control" disabled /></td>
<td><input asp-for="UnapprovedApplications[i].Approved" class="form-control" /></td>
</tr>
}
</tbody>
</table>
</div>
</form>
</div>
@section Scripts {
<partial name="_ValidationScriptsPartial" />
}
必须有一种更灵活的方式来做到这一点,我希望有一天能发现它,但是现在可以使用