我是第一次使用ASP.NET Core和相关技术的学生 . 我花了几个小时寻找这个问题的解决方案,没有运气,所以如果有人可以帮助或指点我的教程来解决这个问题,我将非常感激 .

我的小组和我正在尝试构建一个Web应用程序,以便与现有的SQL数据库进行交互,该数据库包含大量使用连锁主键的表 . 我们无法改变这一点 . 我使用this tutorial来让我们的CRUD编辑页面显示,但如果我尝试通过该编辑页面提交任何更改,我会收到如下错误:

未找到网址的网页:https:// localhost:44311 / GenCollectionSamplers / Edit

经过一些调试后,我们非常肯定这是 the POST Edit method in the Controller getting null IDs 的问题,但我们无法弄清楚如何将正确的ID传递给POST Edit方法 . ID出现在GET Edit消息中 .

如果需要更多代码,请告诉我 .

从Controller编辑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>