Почему данные свойств модели меняются при публикации? - PullRequest
0 голосов
/ 28 марта 2019

OnGet() заполняет UnapprovedApplications данными из AspNetUsers.В настоящее время идентификаторы пользователя верны.

c4d69cbe-436e-4d74-bc7d-c4a99a8cbf34
e184da25-687b-4e51-9f1d-c3a93a732ec1

OnPostAsync(), однако возвращает идентификаторы пользователя как

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" />
}

1 Ответ

0 голосов
/ 28 марта 2019

Это будет действующий монолог в поисках решения этой темы.

Я обнаружил, что IdentityUser имеет конструктор по умолчанию, который генерирует Guid. Происходит то, что данные модели отсутствуют на стороне клиента, и разные идентификаторы пользователей различаются, поскольку данные модели генерируются так, как если бы они были новыми пользователями.

Я нашел эту информацию, опубликованную @ Forty-Two Передача всей модели при отправке формы

Модель будет полностью передана контроллеру, но значения свойств, которые не связаны входными или скрытыми полями, быть потерянным.

Вы должны либо связать свойства в форме на стороне клиента, или повторно выберите объект на стороне сервера.

Похоже, вы спрашиваете что-то вроде @ Html.HiddenFor (m => м.Модель), а это невозможно. К сожалению

Следует помнить одну вещь: если у вас есть тонны скрытых полей, вы можете отправлять больше данных для просмотра, чем вам действительно нужно. Рассматривать использование моделей вида

Я буду реализовывать ViewModel всего агрегированного объекта User в попытке сохранить данные, полученные с помощью 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" />
}

должен быть более гибкий способ сделать это, и я надеюсь обнаружить это однажды, но это работает прямо сейчас

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...