Сначала, пожалуйста, знайте, что я погуглил и перепробовал все, что нашел.Я прошел через решение за решением и прочитал десятки вопросов о переполнении стека, прежде чем опубликовать это.Я понятия не имею, почему это не работает.Тем не менее, я не очень знаком с материалом обработчика методов, поэтому я могу сделать глупую ошибку.
Детали реализации
- .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 в форму и кнопку.Я пытался использовать кнопку и вход.Ничто, похоже, не меняет поведение.
Заголовок моей страницы Razor
@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>
Мой метод в моей модели (метод PostToApiAsync, поэтому я использую Async-версию OnPost)
public void OnPostBuildClickAsync()
{
apiClientCalls.PostToApi("FslSmokeTest", "BuildKickOff");
}
Мой метод OnGetAsync срабатывает, когда страница загружается без проблем.Все, что происходит в этом методе, работает.Я могу ссылаться на модель обычным способом Razor, чтобы модель была доступна и привязана к странице.Я просто не могу запустить метод OnPost в моей модели, когда нажимаю кнопку btnKickOffBuild
.
Если кто-то может указать мне правильное направление, я буду очень признателен.
************* РЕДАКТИРОВАТЬ **********************
Я попытался сделать метод OnPostBuildClickAsync на самом деле Async, и япопробовал, как у меня выше, и снял Async с имени метода, но безрезультатно.
Я также попытался, в качестве теста, отключить все компоненты Anti-Forgery, которые связаны с платформой Razor, глобальнопросто чтобы исключить это.Это тоже не сработало.
Я попытался сделать это совершенно по-другому, добавив метод к моей области видимости Angular, обернутой в функцию javascript, которая должна запускаться только при нажатии кнопки, но так как это на стороне сервера@ тег выполняется при загрузке страницы независимо от условий в функции.
************* РЕДАКТИРОВАТЬ **********************
Это сводится к угловой вещи.
Согласно разделу " Отправка формы и предотвращение действия по умолчанию " в следующей ссылке: 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>
Особо следует отметить действие = "".Это заставляет Angular не блокировать отправку формы на сервер.
В следующем вопросе также есть некоторые подробности, касающиеся Angular Actions:
ng-action не добавляет атрибут действия в форму