Дорогие все,
Это мой первый пост в Stackoverflow, поэтому если что-то не так с постом, пожалуйста, сообщите об этом, чтобы я мог изменить.
Выпуск
У меня есть представление, которое обеспечивает видимость информации об учетной записи выбранного пользователя на основе переданной модели, в которой выбранный ApplicationUser является участником. Когда я делаю запрос HTTPpost с помощью кнопки, все данные из модели передаются, но идентификатор ApplicationUser почему-то меняется, поэтому мое действие HTTPPost позже с FindById работает неправильно.
Модель
public class ModifyAccountModel
{
public ApplicationUser SelectedUser { get; set; }
public IEnumerable<string> CurrentRoles { get; set; }
public IEnumerable<IdentityRole> AvailableRoles { get; set; }
}
Вид
@model Time_Window_Management_MVC.Models.ModifyAccountModel
@{
ViewBag.Title = "Modify Account";
}
<h2>@ViewBag.Title</h2>
@using (Html.BeginForm("ModifyAccount", "Admin", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
<h4>Attributes</h4>
<div>
@ViewBag.Errormessage
</div>
@Html.ValidationSummary("", new { @class = "text-danger" })
<div class="form-group">
<div class="col-md-2">
User ID
</div>
@*@Html.LabelFor(m => m.FirstName, new { @class = "col-md-2 control-label" })*@
<div class="col-md-10">
@Html.DisplayFor(m => m.SelectedUser.Id)
</div>
</div>
<div class="form-group">
<div class="col-md-2">
First Name
</div>
@*@Html.LabelFor(m => m.FirstName, new { @class = "col-md-2 control-label" })*@
<div class="col-md-10">
@Html.TextBoxFor(m => m.SelectedUser.FirstName, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
<div class="col-md-2">
Second Name
</div>
@*@Html.LabelFor(m => m.SecondName, new { @class = "col-md-2 control-label" })*@
<div class="col-md-10">
@Html.TextBoxFor(m => m.SelectedUser.SecondName, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
<div class="col-md-2">
Sales Org.
</div>
@*@Html.LabelFor(m => m.SecondName, new { @class = "col-md-2 control-label" })*@
<div class="col-md-10">
@Html.TextBoxFor(m => m.SelectedUser.SalesOrg, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
<div class="col-md-2">
SAP System
</div>
@*@Html.LabelFor(m => m.SecondName, new { @class = "col-md-2 control-label" })*@
<div class="col-md-10">
@Html.TextBoxFor(m => m.SelectedUser.SAP_System, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
<div class="col-md-2">
Email
</div>
@*@Html.LabelFor(m => m.Email, new { @class = "col-md-2 control-label" })*@
<div class="col-md-10">
@Html.TextBoxFor(m => m.SelectedUser.Email, new { @class = "form-control" })
</div>
</div>
<h4>Roles</h4>
<table class="table">
<tr>
<td>
Role name
</td>
<td>
Actions
</td>
</tr>
@if (Model.CurrentRoles.Count() == 0)
{
<tr>
@Html.ActionLink("Add new role", "AddAccountRole", new { Id = Model.SelectedUser.Id })
</tr>
}
else
{
foreach (var role in Model.CurrentRoles)
{
<tr>
<td>
@role
</td>
<td>
@Html.ActionLink("Delete", "DeleteAccountRole", new { Id = Model.SelectedUser.Id, Role = @role })
</td>
</tr>
}
<tr>
@Html.ActionLink("Add new role", "AddAccountRole", new { Id = Model.SelectedUser.Id })
</tr>
}
</table>
<div class="form-group">
<div class="col-md-12">
<input type="submit" class="btn btn-default" value="Save changes" />
</div>
</div>
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
Действие, отвечающее на почтовый запрос
[HttpPost]
public async Task<ActionResult> ModifyAccount(ModifyAccountModel model)
{
if (ModelState.IsValid)
{
ApplicationUser account = await UserManager.FindByIdAsync(model.SelectedUser.Id);
if (account == null)
{
return RedirectToAction("ManageAccounts", "Admin", "Account modification couldn't be done.");
}
account.FirstName = model.SelectedUser.FirstName;
account.SecondName = model.SelectedUser.SecondName;
account.SalesOrg = model.SelectedUser.SalesOrg;
account.SAP_System = model.SelectedUser.SAP_System;
return RedirectToAction("ModifyAccount", "Admin", new { id = model.SelectedUser.Id });
}
return RedirectToAction("ManageAccounts", "Admin", "Something went wrong.");
}
Единственное, что меняется в модели, - это идентификатор ApplicationUser, все остается как надо.
Я знаю, что в качестве обходного пути я мог бы создать действие, которое просто отправляет идентификатор в виде строки, а затем выполнить поиск FindByIdAsync на основе этого, но все равно хотел бы знать, что вызывает эту проблему.
Я подозреваю, что при публикации публикуется новый ApplicationUser с тем же содержимым, что и у исходного, и поэтому создается новый идентификатор, но я хотел бы получить некоторые пояснения и, возможно, некоторую помощь по этому вопросу.
Большое спасибо за любые отзывы, хорошего дня!
Daniel