首先,请知道我已经用Google搜索并尝试了所有发现的内容。我已经经历了一个又一个的解决方案,并在发布之前阅读了数十个Stack Overflow问题。我不知道为什么这不起作用。话虽这么说,我对方法处理程序不是很熟悉,所以我可能犯了一个愚蠢的错误。
实施细节
-.NET Core 2.2
-Microsoft.AspNetCore.Razor.Design 2.2.0
-AngularJS.Core 1.7.8
我正在创建一个内部门户网站,以汇总Jenkins的构建和测试数据。我想允许运行Jenkins测试的作业版本通过页面上的按钮开始。当我单击按钮时,没有任何错误。我在控制台中什么也没得到,也没有遇到任何实际上触发了OnPost方法的断点。
我尝试使用OnPost和OnPostAsync方法。我尝试通过asp-page-handler以及默认名称使用自定义名称。我尝试将asp-page-handler标记放在表单和按钮上。我尝试使用按钮和输入。似乎没有什么改变行为。
我的剃须刀页眉
@page "{handler?}"
@using JenkinsRazorApi.Pages
@using System.Linq;
@using System.Data;
@using System.Web;
@model FslModel
@{
ViewData["Title"] = "fsl";
}
我的cshtml标记
<div>
<form method="POST">
<input type="submit" class="btnKickOffBuild" name="kickOffBuild" id="btnKickOffBuild" asp-page-handler="BuildClick" value="Build"/>
</form>
</div>
我在模型中的方法(PostToApi方法是Async,这就是为什么我使用OnPost的异步版本)
public void OnPostBuildClickAsync()
{
apiClientCalls.PostToApi("FslSmokeTest", "BuildKickOff");
}
页面加载成功时,我的OnGetAsync方法将触发。该方法中发生的所有事情均有效。我能够以普通的Razor方式引用模型,因此可以访问模型并将其绑定到页面。单击btnKickOffBuild
按钮时,无法触发模型中的OnPost方法。
如果有人可以指出正确的方向,我将非常感激。
************* EDIT **********************
我尝试使OnPostBuildClickAsync方法实际上是异步的,并且尝试了上面的方法,并取消了方法名称的Async的使用。
作为测试,我还尝试了将与Razor框架相关的所有反伪造内容都在全球范围内关闭,以排除这种情况。那也不起作用。
我尝试通过将方法添加到包装在javascript函数中的Angular范围中来使用一种完全不同的方法,该方法仅在单击按钮时才会触发,但是由于它是服务器端@标记,因此无论页面加载如何运行条件。
************* EDIT **********************
归结为一个角度的东西。
按照以下链接中的“ 提交表单并阻止默认操作”部分: https://docs.angularjs.org/api/ng/directive/form
Angular需要一个动作标签才能将表单提交到服务器。没有它,表格将无法提交。我将cshtml更改为:
<div>
<h5 style="margin-left: 50px; float:left;">Test Pass/Fail</h5>
<form method="post" action="">
<button type="submit" class="btnKickOffBuild" asp-page-handler="BuildClick">Build</button>
</form>
</div>
特别值得注意的是action =“”。这迫使Angular不要阻止将表单提交到服务器。
以下问题也详细介绍了Angular Actions:
ng-action does not add action attribute in the form
答案 0 :(得分:2)
编辑: 我找到了它的根本原因。您需要创建一个Razor ViewImport文件,并将该文件中的所有razor依赖项导入。这样,您就可以在应用程序中使用taghelpers