ASP.NET Core 2.1 Edit с объединенным первичным ключом - PullRequest
0 голосов
/ 10 декабря 2018

Я студент, использующий ASP.NET Core и связанные с ним технологии впервые.Я потратил часы на поиски решения этой проблемы без удачи, поэтому, если кто-то может помочь или указать мне учебник, чтобы исправить это, я был бы очень признателен.

Моя группа и я пытаемсяСоздайте веб-приложение для взаимодействия с существующей базой данных SQL, которая содержит множество таблиц с использованием сцепленных первичных ключей.Мы не можем это изменить.Я использовал этот учебник , чтобы наши страницы редактирования CRUD даже отображались, но если я пытаюсь отправить какие-либо изменения через эту страницу редактирования, я получаю ошибку, подобную этой:

Нетвеб-страница была найдена для веб-адреса: https://localhost:44311/GenCollectionSamplers/Edit

После некоторой отладки мы уверены, что это проблема с методом POST Edit в контроллере, получающим нулевые идентификаторы , но мы не можем понять, как передать правильные идентификаторы в метод POST Edit.Идентификаторы присутствуют в сообщении GET Edit.

Дайте мне знать, если потребуется больше кода.

Редактирование GET и POST с контроллера:

// GET: GenCollectionSamplers/Edit/5
    public async Task<IActionResult> Edit(double? peopleID, double? colID)
    {
        if (peopleID == null || colID == null)
        {
            return NotFound();
        }

        var genCollectionSamplers = await _context.GenCollectionSamplers.FindAsync(peopleID, colID);
        if (genCollectionSamplers == null)
        {
            return NotFound();
        }
        ViewData["FkPeopleId"] = new SelectList(_context.GenPeople, "PkPeopleId", "PkPeopleId", genCollectionSamplers.FkPeopleId);
        ViewData["FkCollectionId"] = new SelectList(_context.GenCollections, "CollectionId", "CollectionId", genCollectionSamplers.FkCollectionId);
        return View(genCollectionSamplers);
    }

    // POST: GenCollectionSamplers/Edit/5
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Edit(double peopleID, double colID, [Bind("FkPeopleId,FkCollectionId")] GenCollectionSamplers genCollectionSamplers)
    {
        //Causes error because peopleID and colID are 0
        if (peopleID != genCollectionSamplers.FkPeopleId || colID != genCollectionSamplers.FkCollectionId)
        {
            return NotFound();
        }

        if (ModelState.IsValid)
        {
            try
            {
                _context.Update(genCollectionSamplers);
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!GenCollectionSamplersExists(genCollectionSamplers.FkPeopleId) || !GenCollectionSamplersExists(genCollectionSamplers.FkCollectionId))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }
            return RedirectToAction(nameof(Index));
        }
        ViewData["FkPeopleId"] = new SelectList(_context.GenPeople, "PkPeopleId", "PkPeopleId", genCollectionSamplers.FkPeopleId);
        ViewData["FkCollectionId"] = new SelectList(_context.GenCollections, "CollectionId", "CollectionId", genCollectionSamplers.FkCollectionId);
        return View(genCollectionSamplers);
    }

Модель:

public partial class GenCollectionSamplers
{
    [Required]
    [Display(Name = "Fk People Id")]
    public double FkPeopleId { get; set; }
    [Required]
    [Display(Name = "Fk Collection Id")]
    public double FkCollectionId { get; set; }
    [Required]
    [Display(Name = "Fk Collection")]
    public GenCollections FkCollection { get; set; }
    [Required]
    [Display(Name = "Fk People")]
    public GenPeople FkPeople { get; set; }
}

Редактировать представление:

@model {path removed}.Models.GenCollectionSamplers

@{
    ViewData["Title"] = "Edit";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Edit</h2>

<h4>GenCollectionSamplers</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="Edit">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="FkCollectionId" class="control-label"></label>
                <input asp-for="FkCollectionId" class="form-control" />
                <span asp-validation-for="FkCollectionId" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="FkPeopleId" class="control-label"></label>
                <input asp-for="FkPeopleId" class="form-control" />
                <span asp-validation-for="FkPeopleId" class="text-danger"></span>
            </div>
            <input type="hidden" asp-for="FkPeopleId" />
            <input type="hidden" asp-for="FkCollectionId" />
            <div class="form-group">
                <input type="submit" value="Save" class="btn btn-default" />
            </div>
        </form>
    </div>
</div>

<div>
    <a asp-action="Index">Back to List</a>
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

Часть представления индекса:

<p>
    <a asp-action="Create">Create New</a>
</p>
<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => efModel.FkCollectionId)
            </th>
            <th>
                @Html.DisplayNameFor(model => efModel.FkPeople)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.FkCollection.CollectionId)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.FkPeople.PkPeopleId)
                </td>
                <td>
                    @Html.ActionLink("Edit", "Edit", new { peopleID = item.FkPeopleId, colID = item.FkCollectionId }) |
                    @Html.ActionLink("Details", "Details", new { peopleID = item.FkPeopleId, colID = item.FkCollectionId }) |
                    @Html.ActionLink("Delete", "Delete", new { peopleID = item.FkPeopleId, colID = item.FkCollectionId })
                </td>
            </tr>
        }
    </tbody>
</table>

1 Ответ

0 голосов
/ 14 декабря 2018

Почему у вас есть скрытые поля в представлении редактирования:?

<input type="hidden" asp-for="FkPeopleId" />
<input type="hidden" asp-for="FkCollectionId" /

Именно это привязывается к модели при отправке HttpPost, и так как им не назначены какие-либо значения, выполучают 0. Избавьтесь от этих двух скрытых полей.Отрендеренная страница создаст скрытые поля во время выполнения (проверьте вашу отрисованную разметку для страницы редактирования) вместе с __RequestVerificationToken, который знает, какой экземпляр этой Модели должен быть проверен и затем обновлен.

...