Я работаю через этого урока . Я пришел к той части, где я добавляю обработчик событий для флажков. У меня были некоторые проблемы с этим, поэтому я добавил вызовы alert (), чтобы увидеть, что скрипт выполняется. У меня также есть вызовы Console.WriteLine () в моем контроллере, чтобы сообщить, когда ящик был успешно обработан и когда он вышел из строя.
Когда у меня есть вызов alert () в функции markCompleted (), сообщение появляется дважды. И в окне консоли, из которого запускается проект, я сначала вижу отчет об успехе, а затем отчет об ошибке. Похоже, что при наличии вызова alert () событие click для флажка запускается дважды. Это почему? Когда я удаляю вызов alert (), я получаю только одно сообщение в окне консоли, и операция завершается успешно.
Вот JavaScript учебник, который мне нужно было вставить:
$(document).ready(function () {
// Wire up all of the checkboxes to run markComnpleted()
//alert("Document ready function");
$('.done-checkbox').on('click', function (e) {
markCompleted(e.target);
});
});
function markCompleted(checkbox) {
alert("Mark completed function.");
checkbox.disabled = true;
var row = checkbox.closest('tr');
$(row).addClass('done');
var form = checkbox.closest('form');
form.submit();
}
А вот код моего контроллера:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using AspNetCoreTodo.Services;
using AspNetCoreTodo.Models;
namespace AspNetCoreTodo.Controllers
{
public class ToDoController : Controller
{
private readonly IToDoItemService _toDoItemService;
public ToDoController(IToDoItemService toDoItemService)
{
_toDoItemService = toDoItemService;
}
public async Task<IActionResult> Index()
{
// Get to-do items from database
var items = await _toDoItemService.GetIncompleteItemsAsync();
// Put items into a model
var model = new ToDoViewModel()
{
Items = items
};
// Render view using the model
return View(model);
}
[ValidateAntiForgeryToken]
public async Task<IActionResult> AddItem(ToDoItem newItem)
{
if (!ModelState.IsValid)
{
return RedirectToAction("Index");
}
var successful = await _toDoItemService.AddItemAsync(newItem);
if (!successful)
{
return BadRequest("Could not add item.");
}
return RedirectToAction("Index");
}
[ValidateAntiForgeryToken]
public async Task<IActionResult> MarkDone(Guid id)
{
if (id == Guid.Empty)
{
Console.WriteLine("Received invalid or empty Guid");
return RedirectToAction("Index");
}
bool successful = await _toDoItemService.MarkDoneAsync(id);
if (!successful)
{
Console.WriteLine("Failed to mark item as done.");
return BadRequest("Could not mark item as done.");
}
Console.WriteLine("Item marked done.");
return RedirectToAction("Index");
}
}
}
Наконец, вот код из службы:
public async Task<bool> MarkDoneAsync(Guid id)
{
var item = await _context.Items
.Where(x => x.Id == id)
.SingleOrDefaultAsync();
if (item == null)
return false;
item.IsDone = true;
int saveResult = await _context.SaveChangesAsync();
return saveResult == 1;
}