Ошибка ASP.NET Core MVC — редактирование удаления не работает

Я реконструировал таблицу из базы данных и вышел из нее. Затем добавил контроллер со всеми каркасами для представлений и контекста. В моей таблице нет традиционного первичного ключа, такого как «Id», у нее есть сложный ключ. Однако у меня есть столбец Id, который уникален.

Когда представления были созданы, настройка была правильной. Я заметил, что в поле «Редактировать, Детали и Удалить» ссылки на действия закомментированы. Я удалил комментарии и указал элементы модели на поле «Id».

Мое поле «Идентификатор» является ориентиром, но я не думаю, что это проблема. Когда я нажимаю ссылку редактирования в представлении, я получаю сообщение о том, что страница не найдена. Любая помощь будет принята с благодарностью.

<h2>Index</h2>

<p>
    <a asp-action="Create">Create New</a>
</p>
<table class="table">
    <thead>
        <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Id)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Dark)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Lit)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Contra)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.CreateDate)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.CreateBy)
                </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
@foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Id)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Dark)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Lit)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Contra)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.CreateDate)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.CreateBy)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new {  id=item.Id }) |
                @Html.ActionLink("Details", "Details", new { id = item.Id }) |
                @Html.ActionLink("Delete", "Delete", new { id = item.Id })
            </td>
        </tr>
}
    </tbody>
</table>

Вот мой контроллер

public class RoutePartnersController : Controller

{
    private readonly TraderContext _context;

    public RoutePartnersController(TraderContext context)
    {
        _context = context;    
    }

    // GET: RoutePartners
    public async Task<IActionResult> Index()
    {
        return View(await _context.RoutePartner.ToListAsync());
    }

    // GET: RoutePartners/Details/5
    public async Task<IActionResult> Details(Guid? id)
    {
        if (id == null)
        {
            return NotFound();
        }

        var routePartner = await _context.RoutePartner
            .SingleOrDefaultAsync(m => m.PartnerId == id);
        if (routePartner == null)
        {
            return NotFound();
        }

        return View(routePartner);
    }

    // GET: RoutePartners/Create
    public IActionResult Create()
    {
        return View();
    }

    // POST: RoutePartners/Create
    // 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> Create([Bind("Id,PartnerId,RouteCompany,RouteCode,Dark,Lit,Contra,CreateDate,CreateBy")] RoutePartner routePartner)
    {
        if (ModelState.IsValid)
        {
            routePartner.PartnerId = Guid.NewGuid();
            _context.Add(routePartner);
            await _context.SaveChangesAsync();
            return RedirectToAction("Index");
        }
        return View(routePartner);
    }

    // GET: RoutePartners/Edit/5
    public async Task<IActionResult> Edit(Guid? id)
    {
        if (id == null)
        {
            return NotFound();
        }

        var routePartner = await _context.RoutePartner.SingleOrDefaultAsync(m => m.PartnerId == id);
        if (routePartner == null)
        {
            return NotFound();
        }
        return View(routePartner);
    }

    // POST: RoutePartners/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(Guid id, [Bind("Id,PartnerId,RouteCompany,RouteCode,Dark,Lit,Contra,CreateDate,CreateBy")] RoutePartner routePartner)
    {
        if (id != routePartner.PartnerId)
        {
            return NotFound();
        }

        if (ModelState.IsValid)
        {
            try
            {
                _context.Update(routePartner);
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!RoutePartnerExists(routePartner.PartnerId))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }
            return RedirectToAction("Index");
        }
        return View(routePartner);
    }

    // GET: RoutePartners/Delete/5
    public async Task<IActionResult> Delete(Guid? id)
    {
        if (id == null)
        {
            return NotFound();
        }

        var routePartner = await _context.RoutePartner
            .SingleOrDefaultAsync(m => m.PartnerId == id);
        if (routePartner == null)
        {
            return NotFound();
        }

        return View(routePartner);
    }

    // POST: RoutePartners/Delete/5
    [HttpPost, ActionName("Delete")]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> DeleteConfirmed(Guid id)
    {
        var routePartner = await _context.RoutePartner.SingleOrDefaultAsync(m => m.PartnerId == id);
        _context.RoutePartner.Remove(routePartner);
        await _context.SaveChangesAsync();
        return RedirectToAction("Index");
    }

    private bool RoutePartnerExists(Guid id)
    {
        return _context.RoutePartner.Any(e => e.PartnerId == id);
    }
}

person DanConsultant    schedule 06.07.2017    source источник


Ответы (1)


Хорошо, я понял, что не так. У меня есть таблица с 7 столбцами. Первый столбец — это столбец «Идентификатор», который мы используем для быстрой идентификации строки. Это НЕ первичный ключ. Столбцы 2, 3 и 4 являются первичным ключом. Как ни странно, когда были созданы леса, столбцы первичного ключа НЕ были включены в представление. В конечном итоге это привело к тому, что представления не работали. Это ошибка VS 2017?

person DanConsultant    schedule 06.07.2017
comment
Ответив на свой вопрос, отметьте его как Ответить. - person Win; 06.07.2017
comment
Извините, новичок на этом форуме. Я думал, что пометил это как ответ. - person DanConsultant; 06.07.2017
comment
Не проблема. Обычно мы ищем оставшиеся без ответа вопросы, чтобы помочь сообществу. Итак, вы не хотите, чтобы другие прочитали вопрос длиной в страницу и в конце поняли, что вы уже ответили на свой собственный вопрос. - person Win; 06.07.2017
comment
Спасибо. Пожалуйста, дайте мне знать, если я сделал что-то не так. Этот форум очень полезен. - person DanConsultant; 07.07.2017
comment
Слева от этого ответа стоит галочка. Пожалуйста, проверьте это. - person Win; 07.07.2017
comment
Хорошо, сделал это, но мне сказали, что мне нужно подождать 20 часов. - person DanConsultant; 07.07.2017