适用于与Razor Pages相关的问题,这是从ASP.NET Core 2.0开始的ASP.NET Core的一个功能。
我对 ASP.NET Core 2.0 的 MVC 和 razor 项目非常困惑。 在 Visual Studio 2017 中我执行以下操作: 新项目 Web ASP.NET Core 应用程序 (C#) Web 应用程序(不是 Web 应用程序 MV...
我有一个 ASP.NET Core 3.1 Razor Pages 和 MVC 应用程序。 当页面只有一个表单时,这很简单,但是当表单很少时,如何正确显示错误呢? 例子: /管理用户.c...
在 ASP.NET Core Razor 视图中 POST 错误时显示错误?
我正在尝试找出显示可在我的应用程序的所有页面中显示的通用错误消息的最佳方式。执行表单 POST 请求时应显示错误视图。 ...
如何在razor页面ASP.Net Core 8中的“a”标签后添加逗号
我试图在 foreach 中的“a”标签后面添加逗号(,),如下所示: @foreach(Model.Product.Categories 中的 var 项目) { 我试图在 foreach 中的“a”标签后面添加逗号(,),如下所示: @foreach (var item in Model.Product.Categories) { <a href="#" class="product-link product-cat-title">@item.Name</a> , } 但我收到错误消息“} Expected”。我该怎么办? 我已经测试了@string.join(", ", Model.Categories.Select(p => p.Name).ToArray()),但这将返回字符串或文本。我要链接! 值得一提的是,我不想添加其他标签,例如 <span> 或 <a>。我知道他们有效。如果有人能解释为什么它不起作用,我将不胜感激? 谢谢 @foreach (var item in Model.Product.Categories) { <a href="#" class="product-link product-cat-title">@item.Name</a> <a >,</a> }
如何在 ASP.NET Core 中正确使用 Partial View 并验证其模型状态
我正在使用 ASP.NET Core 5 Razor 页面。 我的目标是拥有一组可以在多个页面上使用的部分视图(出于可重用性目的)。每个部分视图都有一个带有自己的自定义发布事件的表单
默认情况下,ASP.NET Core 中的输入验证使用类 input-validation-error,但 Bootstrap 5 使用 is-invalid。 我找到了一些解决方案: 创建样式 使用 jQuery.validate.unobtrusi...
HtmlHelpers Html.LabelFor/TextBoxFor/EditorFor 在 ASP.NET Core Razor 页面中无法识别
我有一个从 .NET Core 3.1 迁移的 .NET 5.0 MVC 项目,但使用 Html.LabelFor、Html.TextBoxFor 或 Html.EditorFor 的表单不显示输入。 看法: @模型更新产品视图模型; @{ 使用...
同一解决方案中的 ASP.NET Core 5 MVC/RazorPages 和 WebAPI 项目
许多站点分为两部分: www.example.com:供访客使用的公共 MVC / RazorPages 服务器渲染应用程序 app.example.com:供客户和管理员使用的私有 WebAPI 应用程序(可通过 SPA 访问) 这两个
在 ASP.NET Core 3.1 Razor Pages 中打印 PDF
在学习 ASP.NET Core 的过程中,我使用 ASP.NET Core 3.1 创建了一个简单的 CRUD 应用程序。我想将详细信息页面打印为发票。我环顾四周,似乎是在……中打印 PDF
我有一个通过 Razor Pages 构建的表单。该表单由两个提交按钮组成 - 每个按钮都分配给适当的 asp 页面处理程序,如下所示: @page“{id:int}” //... 我有一个通过 Razor Pages 构建的表单。该表单由两个提交按钮组成 - 每个按钮都分配给适当的 asp-page-handler,如下所示: @page "{id:int}" //... <form asp-action="Post"> <input type="submit" asp-page-handler="Approve" class="btn btn-success" value="Approve" /> <input type="submit" asp-page-handler="Decline" class="btn btn-danger" value="Decline" /> </form> 我的处理程序工作正常。现在我需要根据某种条件禁用“批准”按钮。不幸的是,我不知道使用 Razor Pages 实现此目的的正确方法是什么? 我尝试了以下方法(条件已简化): @{ var disableTag = "disabled"; } ... <input type="submit" asp-page-handler="Approve" class="btn btn-success" value="Approve" @disableTag /> 应用程序启动后,标记保持不变,按钮仍然启用。似乎 asp-page-handler 标签强制 Razor 引擎忽略 @disableTag 变量。 下一次尝试是(@disableTag被放在asp-page-handler前面): <input type="submit" @disableTag asp-page-handler="Approve" class="btn btn-success" value="Approve" / 现在页面渲染正确(disabled标签在那里),但处理程序本身停止工作(标记将asp-page-handler="Approve"显示为普通标签,而不是像/{PageName}/{id}?handler=Approve之类的东西) 我在这里做错了什么? 尝试以标签助手的方式思考。禁用是一个您可以定义的属性,就像等效标记帮助器支持的所有其他属性一样。您可以在下面找到两种不同的方法来定义按钮的禁用属性: @{ bool disable1 = true; string disable2 = "disable"; // or string disable2 = null; } <h2>Test</h2> <form asp-action="Post"> <input type="submit" asp-page-handler="Approve" class="btn btn-success" value="Approve" disabled="@(disable1 ? "disabled" : null)" /> <input type="submit" asp-page-handler="Decline" class="btn btn-danger" value="Decline" disabled="@disable2" /> </form> 希望有帮助。 完整示例 DisabledButton.cshtml.cs using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; namespace MyWebApplication.Pages { public class DisabledButtonModel : PageModel { public bool Disbale1 { get; set; } public bool Disbale2 { get; set; } public void OnGet() { } public ActionResult OnPostApprove() { Disbale1 = true; Disbale2 = false; return Page(); } public ActionResult OnPostDecline() { Disbale1 = false; Disbale2 = true; return Page(); } } } DisabledButton.cshtml @page "{handler?}" @model MyWebApplication.Pages.DisabledButtonModel <form asp-action="Post"> <input type="submit" asp-page-handler="Approve" class="btn btn-success" value="Approve" disabled="@(Model.Disbale1 ? "disabled" : null)" /> <input type="submit" asp-page-handler="Decline" class="btn btn-danger" value="Decline" disabled="@(Model.Disbale2 ? "disabled" : null)" /> </form>
我在 RazerPages 应用程序中收到 CS1061 错误,告诉我定义不存在,但确实存在,有人可以向我指出这个问题吗?
我正在开发一个 CRUD ASP.NET Razor Pages 应用程序,该应用程序允许用户搜索大陆、国家,并添加和远程有关它们的数据。我收到以下关于索引模型的错误...
如何将位于应用程序部分(DLL)中的部分视图渲染到主asp.net core 2.2项目中
我有一个 ASP.NET Core 2.2 项目及其控制器和视图。由于项目要求,我需要创建一个 Razor 类库来将一些 .cshtml 文件和控制器与主文件分离
请参阅下面我的 Razor 页面示例。我正在尝试将最后一个月作为字符串。例如,下面的代码给我“2020 年 11 月”,但我试图获取“2020 年 10 月” ...
我有一个项目,其中所有路径都通过同一个 /index 页面路由,但是这会通过同一个页面引导图像/css/js 文件。在下面的示例中,我想知道如何排除...
我正在使用新的.NET Core Razor 页面。如果我有多个按钮,如何获取每个按钮的值? 例如,在我的剃刀页面中,我有 2 个按钮: < 我正在使用新的 .NET Core Razor 页面。如果我有多个按钮,如何获取每个按钮的值? 以我的剃须刀页面为例,我有 2 个按钮: <form method="post"> <button type="submit" value="2020" id="btn1">2020</button> <button type="submit" value="2019" id="btn2">2019</button> </form> 在我的代码后面: public void OnPost() { // How to get btn1 value (2020) and btn2 value (2019) here? } 正如约翰所说,您只能检索用于提交表单的按钮的值。 如果你想发布这两个按钮,将它们放入隐藏变量是一个好方法。 注意: asp.net core 模型绑定系统将通过 html 元素中的名称而不是 id 来绑定值。 一种方法是手动添加这些输入: <form method="post"> <input hidden value="2020" name="btn1"/> <input hidden value="2019" name="btn2"/> <button type="submit" value="2020" id="btn1">2020</button> <button type="submit" value="2019" id="btn2">2019</button> </form> 另一种方法是使用jquery自动添加输入: <form method="post"> <button type="submit" value="2020" id="btn1">2020</button> <button type="submit" value="2019" id="btn2">2019</button> </form> @section Scripts { <script> $("form").submit(function () { $("button[type=submit]").each(function (i) { i++; var value = $(this).val(); var input = $("<input>") .attr("type", "hidden") .attr("name", "btn" + i).val(value); $('form').append(input); }); }); </script> } 后端: public void OnPost(int btn1,int btn2) { //do your stuff... } 结果:
我正在使用 .net core 5.0 将一些初始 razor 代码升级到 asp .net razor 页面。我已经在 Microsoft Learn 上查看了许多示例,但似乎我必须在所有 .csh 中设置属性...
我在剃刀页面上有以下表格: 我的剃刀页面上有以下表格: <form method="post"> <table> <tr> <td style="padding-bottom: 10px;" class="login-entry">User Name</td> <td style="padding-bottom: 10px;"><input type="text" asp-for="LoginName" class="logins" autocomplete="off" /></td> </tr> <tr> <td style="padding-bottom: 10px;" class="login-entry">Password</td> <td style="padding-bottom: 10px;"><input type="password" asp-for="Password" class="logins" /></td> </tr> <tr> <td colspan="2" style="text-align:right;"><input type="submit" value="login" /></td> </tr> </table> </form> 然后,在我的 PageModel 中,我有两个属性,以及 OnPostAsync: public string LoginName { get; set; } public string Password { get; set; } public async Task<IActionResult> OnPostAsync() { // Login code here } 问题是,当我调试页面,输入用户名和密码,然后单击“登录”时,在 OnPostAsync 方法中,属性 LoginName 和 Password 均为空。 有人知道为什么这不起作用吗?或者当这些事情不起作用时追踪它们的方法? 您可以添加此属性[BindProperty],如下所示: [BindProperty] public string LoginName { get; set; } [BindProperty] public string Password { get; set; } public async Task<IActionResult> OnPostAsync() { // Login code here } 结果:
我有一个列表<>,我需要将列表的每一行传递给存储过程。 我目前有一个 for every 循环来计算循环中的行数并迭代很多次......
对脚本和样式表进行分组以便将它们作为一组调用并在一个位置进行管理的最佳方法是什么? 我在我的剃刀页面上使用第三方数据网格控件,并且有se...
为什么我的 JSON POST 到 ASP.NET Core Razor 页面模型返回 null?
这是我的 JS 脚本,用于将学生成绩推送到页面模型。当我检查学生分数时,它具有以下值: 如果(btnTakeScore){ btnTakeScore.onclick = 函数 (e) { ...</desc> <question vote="0"> <p>这是我的 JS 脚本,用于将学生成绩推送到页面模型。当我检查学生分数时,它有值:</p> <pre><code><script> if (btnTakeScore) { btnTakeScore.onclick = function (e) { e.preventDefault(); var rows = document.querySelectorAll('tbody tr'); let studentScores = []; for (let i = 0; i < rows.length; i++) { let studentId = rows[i].getAttribute('studentId'); studentScores.push({ studentId: studentId, sessionId: cboSession.value, termId: cboTerms.value, classId: cboClass.value, subjectScores: [] }) let tds = rows[i].querySelectorAll('td input[type="number"]'); for (let j = 0; j < tds.length; j++) { // Simulate missing score instead of a 0; let ctrl = tds[j]; if (ctrl.value !== '') { studentScores[i].subjectScores.push({ studentId: studentId, subjectId: tds[j].getAttribute('subjectId'), score: ctrl.value, scoreTypeId: cboScoreType.value }); } } } // call server here to post the data //const serverUrl = 'https://localhost:44301/api/SaveStudentScores'; const serverUrl = '@Url.Page("/Teacher/StudentScore")?handler=SaveScore'; let r = new XMLHttpRequest(); r.open('post', serverUrl); r.setRequestHeader('content-Type', 'application/json'); r.setRequestHeader("XSRF-TOKEN", $('input:hidden[name="__RequestVerificationToken"]').val()); r.send(JSON.stringify(studentScores)); r.onload = function () { if (r.status === 200) { var res = JSON.parse(this.responseText); if (res.status === true) { alert(res.message); // clear the fields. var inputs = document.querySelectorAll('table#scoreEntry input[type="number"]'); inputs.forEach(d => d.value = '0'); // reset the scores to Zero } } } } } <script> </code></pre> <p>这是我的 PageModel OnPost。到了这里,scores 值就变成空了:</p> <pre><code>public async Task<JsonResult> OnPostSaveScore([FromBody]IEnumerable<StudentScoreContainer> scores) { try { // Code to push date to the database } return new JsonResult(new { status = true, messsage = "Student(s) score saved!" }); } catch (Exception ex) { return new JsonResult(new { status = false, message = ex.Message }); } } public struct StudentScoreContainer { public int studentId { get; set; } public int classId { get; set; } public int sessionId { get; set; } public int termId { get; set; } public int scoreTypeId { get; set; } public IEnumerable<SubjectScoreContainer> subjectScores { get; set; } } public struct SubjectScoreContainer { public int studentId { get; set; } public int subjectId { get; set; } public int score { get; set; } } </code></pre> <p>这是我的 HTML 代码</p> <pre><code><div class="card-body"> <div class="row"> <div class="col-sm-2"> <div class="form-group"> <label>Class Room<span class="text-danger">* </span></label> <select id="classRoom" class="select" form="searchForm" required="required" asp-items="@(new SelectList(Model.Classess, "Class.Id","Class.Name"))"> <option value="">Select ClassRoom</option> </select> </div> </div> <div class="col-sm-2"> <div class="form-group"> <label>Session<span class="text-danger">*</span></label> <select id="session" class="select" required="required" asp-items="@(new SelectList(Model.Sessions, "Id","Name"))"> <option value="">Select Session</option> </select> </div> </div> <div class="col-sm-2"> <div class="form-group"> <label>Term<span class="text-danger">*</span></label> <select id="term" class="select" required="required" asp-items="@(new SelectList(Model.Terms, "Id","Name"))"> <option value="">Select Term</option> </select> </div> </div> <div class="col-sm-2"> <div class="form-group"> <label>Score Types<span class="text-danger">*</span></label> <select id="cboScoreType" class="select" required="required" asp-items="@(new SelectList(Model.ScoreTypes, "Id","Name"))"> <option value="">Select ScoreType</option> </select> </div> </div> <div class="col-md-3"> <label></label> <p></p> <button id="btnSearch" type="submit" class="btn btn-success btn-block"> Search </button> </div> </div> <div class="row"> <div class="col-lg-12"> <div class="table-responsive"> <table class="table table-striped custom-table table-nowrap mb-0" id="studentList"> <thead> <tr> <th>Student</th> @foreach (var s in Model.SubjectsByTeacher) { <th style="text-align:center">@s.Subject.Name</th> } </tr> </thead> <tbody> @foreach (var student in Model.Students) { <tr studentId="@student.StudentID"> <td>@(student.FirstName.Trim() + " " + student.LastName.Trim())</td> @foreach (var subject in Model.SubjectsByTeacher) { <td style="text-align:center"><input type="number" min="0" max="100" class="form-control" studentId="@student.StudentID" subjectId="@subject.Subject.Id" /></td> } </tr> } </tbody> </table> <br /> </div> </div> <div> </div> </div> <div class="row"> <div class="col-md-12"> <div class="form-group"> <button id="btnTakeScore" class="btn btn-primary"> <i class="fa fa-pen"></i> &nbsp; <b>Take Scores</b> </button> </div> </div> </div> </div> </code></pre> </question> <answer tick="true" vote="0"> <p>根据你的js和razor页面代码,我发现你直接读取了getAttribute值并将其post到页面方法中。</p> <p>由于studentId等属性都是int类型,但是从html代码中得到的值是字符串。这就是页面模型不能很好绑定值的原因。</p> <p>我建议你可以在js中将<pre><code>rows[i].getAttribute('studentId')</code></pre>转换为int。</p> <p>如下:</p> <p>由于我没有完整的js代码和pagemodel的类,所以我只是创建一个测试js模型来测试它。</p> <p>您可以尝试按照以下代码替换您已有的js代码。</p> <p>学生成绩:</p> <pre><code>studentScores.push({ studentId: +studentId, sessionId: +cboSession.value, termId: +cboTerms.value, classId: +cboClass.value, subjectScores: [] }) </code></pre> <p>科目成绩:</p> <pre><code> studentScores[i].subjectScores.push({ studentId: +studentId, subjectId: +tds[j].getAttribute('subjectId'), score: +ctrl.value, scoreTypeId: +cboScoreType.value }); </code></pre> <hr/> <p>正如 @Joseph Ebenezer 评论,我们还可以使用 NewtonsoftJson 而不是 System.Text.Json 来解决这个问题。</p> <p>更多详情,可以参考以下代码:</p> <p>从以下网址安装 Microsoft.AspNetCore.Mvc.NewtonsoftJson:</p> <p><a href="https://www.nuget.org/packages/Microsoft.AspNetCore.Mvc.NewtonsoftJson" rel="nofollow noreferrer">https://www.nuget.org/packages/Microsoft.AspNetCore.Mvc.NewtonsoftJson</a></p> <p>将以下代码添加到startup.cs配置服务方法中:</p> <pre><code> services.AddRazorPages().AddNewtonsoftJson(); </code></pre> </answer> </body></html>