ASP.NET MVC + Идентификация реализации // В модели возвращается другой идентификатор, отличный от видимого - PullRequest
0 голосов
/ 12 сентября 2018

Дорогие все,

Это мой первый пост в 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

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Вы можете использовать @Html.HiddenFor(m => m.SelectedUser.Id) отл. или, как писал Ризки Д.Праст, @Html.TextBoxFor(m => m.SelectedUser.Id), new { @readonly = true }) с атрибутом readonly.

0 голосов
/ 12 сентября 2018

Добрый день, в этой строке

@Html.DisplayFor(m => m.SelectedUser.Id)

будет отображать только int текущего userId в виде html-строки

, она не будет включена в вашпосле отправки запроса на вашем сервере the Binding будет каждый раз создавать нового ApplicationUser с a new GUID.попробуйте просто изменить его на

@Html.TextBoxFor(m => m.SelectedUser.Id)

, что приведет к html input (с атрибутом Name)

...