我正在使用Visual Studio 2019和Win10来完成"The Little ASP.Net Core Book"。该项目设置为w64构建。我将其以调试模式构建为可执行文件,然后从命令窗口运行该文件。我没有使用“ dotnet”命令运行它。
我已经了解到程序正在使用数据库填充屏幕,并且可以使用屏幕向数据库添加新项目。每个项目以其自己的小形式显示,带有其名称和一个复选框。该项目的下一步不是为数据库中的每个项目提供一个“提交”按钮(这确实很笨拙),而是为每个复选框提供一个事件处理程序。这是我应该使用的Javascript文件。它名为site.js,在我项目的wwwroot / js中。
$(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();
}
我添加了警报调用,因此可以看到该脚本实际上正在执行。首次生成网页时,将出现“文档就绪功能”消息,而当我单击复选框时,将出现“标记完成功能”消息。都没有消息发生。我猜想我错过了告诉网页使用此脚本的步骤(或者本教程错过了一步)。这是Index.cshtml文件:
<!DOCTYPE html>
@model ToDoViewModel
@using Humanizer
@{
ViewData["Title"] = "Manage your ToDo list";
}
<div class="panel panel-default todo-panel">
<div class="panel-heading"> @ViewData["Title"]</div>
<table class="table table-hover">
<thead>
<tr>
<td>✔</td>
<td>Item</td>
<td>Due</td>
</tr>
</thead>
@foreach (var item in Model.Items)
{
<tr>
<td>
<form asp-action="MarkDone" method="post">
<Input type="checkbox" class="done-checkbox" />
<input type="hidden" name="id" value="@item.Id" />
</form>
</td>
<td>@item.Title</td>
<td>@item.DueAt.Humanize()</td>
</tr>
}
</table>
<div class="panel-footer add-item-form">
@await Html.PartialAsync("AddItemPartial", new ToDoItem())
</div>
</div>
我的布局文件在定义页面的页脚后,在末尾指定了文件。这是相关的行:
<script src="/lib/jquery/dist/jquery.min.js"></script>
<script src="/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="/js/site.js"></script>
我的布局文件shared / _layout.cshtml以此结尾:
<script src="~/lib/jquery/dist/jquery.min.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
@RenderSection("Scripts", required: false)
</body>
</html>
[当我运行程序并尝试通过https://localhost:5001/todo使用它并拉起DevTools时,它显示出我的所有程序查找Javascript文件的尝试均导致404(未找到)错误。当我将鼠标悬停在DevTools网络标签上的名称site.js上时,工具提示会显示完整的文件名s https://localhost:5001/js/site.js。
Reddit上一位乐于助人的人说,所有这些看起来都是正确的。为什么不起作用?您还需要我向您展示什么?
发布以上内容后,我在Microsoft Edge中进行了尝试。那里的DevTools告诉我,我还有第二条DOCTYPE行。页面来源向我展示了这一点:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Manage your ToDo list - AspNetCoreTodo</title>
<link rel="stylesheet" href="/lib/bootstrap/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="/css/site.css" />
</head>
<body>
<header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container">
<a class="navbar-brand" href="/">AspNetCoreTodo</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" href="/">Home</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" href="/Home/Privacy">Privacy</a>
</li>
<li class="nav-item">
<a href="/ToDo">My ToDos</a>
</li>
</ul>
</div>
</div>
</nav>
</header>
<div class="container">
<main role="main" class="pb-3">
<!DOCTYPE html>
我的_layout.cshtml文件具有此:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - AspNetCoreTodo</title>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="~/css/site.css" />
</head>
<body>
<header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container">
<a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">AspNetCoreTodo</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
</li>
<li class="nav-item">
<a asp-controller="ToDo" asp-action="index">My ToDos</a>
</li>
</ul>
</div>
</div>
</nav>
</header>
<div class="container">
<main role="main" class="pb-3">
@RenderBody()
</main>
</div>
所以,看起来对RenderBody()的调用不起作用。我在项目中看不到该方法的定义。是我需要自己写的东西,还是应该自动生成?
我认为您应该在cshtml页面的末尾添加此内容
@section Scripts {
<script>
$(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);
});
});
</script>
}
并将markCompleted保留到您的js文件中。但是,如果此功能是针对此页面的,那么我看不出有单独的JS的正当理由