Что такое «URL» для ajax-вызова функции C # в приложении основных страниц бритвы asp.net - PullRequest
0 голосов
/ 12 апреля 2019

В автоматически сгенерированном файле site.js проекта ASP.NET Core Razor Pages в Visual Studio я пытаюсь вызвать с помощью Ajax

    $.ajax
        ({
            type: "POST",
            url: "",
            data: "asdsad",
            dataType: "text",
            success: function (result) {
                alert(result);
            },
            error: function (status, ex) {
                alert("Error Code: Status: " + status + " Ex: " + ex);
            }
        });

функция C #. Дерево моего проекта выглядит так:

ASP.NET Core Razor Pages project tree

Файл builder.cshtml.cs также был автоматически сгенерирован Visual Studio, когда я добавил страницу builder.cshtml. Внутри моего builder.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 MyProjectName.Pages
{
    public class Index1Model : PageModel
    {
        public string Message { get; set; } = "Initial Request";
        public void OnGet()
        {
            Message = "Test1";
        }

        public void HelloFunc()
        {
            Message = "BuilderJob";
        }
    }
}

Я добавил функцию HelloFunc() и переменную Message. После изучения документации ASP.NET Core от Microsoft я не понимаю, что такое «URL» для вызова HelloFunc из моего кода Ajax. Это не /builder/HelloFunc (не работает). Как получить доступ к этому HelloFunc из моего вызова Ajax?

Ответ состоит в том, чтобы изменить HelloFunc на OnPostHelloFunc() и использовать это url: /builder?handler=HelloFunc, и если вы просто тестируете и не используете токен проверки, вставьте [IgnoreAntiforgeryToken (Order = 1001)], как указано здесь проверить страницу .net core 2 с помощью Postman return 400 неверный запрос

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

Razor Pages использует для этого обработчики страниц. Поэтому, если вы хотите разместить POST на своей странице, создайте метод с именем OnPost{HandlerName} или OnPost{HandlerName}Async, если это асинхронный метод.

Как пример, если у вас есть форма и вы хотите что-то удалить, вам понадобится обработчик страницы, подобный этому:

public async Task<IActionResult> OnPostDeleteAsync(int id)
{
    var itemToDelete = await _mapRepo.GetByIdAsync(id);
    if (itemToDelete == null)
    {
        //...
    }

    await _mapRepo.Delete(itemToDelete);
    return RedirectToPage("Maps");
}

OnPost заявляет, что ядро ​​asp.net будет прослушивать POST-запрос, Delete - это имя, а Async - соглашение об именах для асинхронных обработчиков.

В вашей форме вы просто объявите элемент ввода, который будет вызывать этот обработчик во время события onclick:

<button type="submit" class="btn btn-danger btn-block" asp-page-handler="Delete" asp-route-id="@Model.Id">Delete</button>

Делаем это с помощью ajax:

$.ajax
({
    type: "POST",
    url: "/builder?handler=HelloFunc",
    dataType: "text",
    success: function (result) {
        alert(result);
    },
    error: function (status, ex) {
        alert("Error Code: Status: " + status + " Ex: " + ex);
    }
});

С помощью метода обработчика:

public void OnPostHelloFunc()
{
    //...
}

Вот хорошее прочтение именованных обработчиков: https://www.learnrazorpages.com/razor-pages/handler-methods

1 голос
/ 12 апреля 2019

Пожалуйста, обратитесь к этому Razor Pages в документации ASP.NET Core , здесь они упомянули имя файла и карту пути с соответствующим URL.

Например:

/ Pages / Index.cshtml => / или / Index

/ Pages / Contact.cshtml => / Контакт

Другое дело, что Razor Pages следуют определенному соглашению об именах. Он начинается с префикса " On ", за которым следует HTTP-глагол, например OnGet(), OnPost() и т. Д. Однако мы также можем указать собственные имена. Например -

  • OnGetPatientList ()
  • OnPostHelloFunc ()

Теперь, если мы поговорим о вашем деле, вам нужно внести следующие изменения в ваш файл builder.cshtml.cs.

namespace MyProjectName.Pages
{
    public class Index1Model : PageModel
    {
        public string Message { get; set; } = "Initial Request";
        public void OnGet()
        {
            Message = "Test1";
        }

        public IActionResult OnPostHelloFunc()
        {
            return Content("BuilderJob");
        }
    }
}

и ваша функция ajax выглядит так -

$.ajax
({
    type: "POST",
    url: "/builder?handler=HelloFunc",
    dataType: "text",
    beforeSend: function (xhr) {
            xhr.setRequestHeader("XSRF-TOKEN",
                $('input:hidden[name="__RequestVerificationToken"]').val());
    },
    success: function (result) {
        alert(result);
    },
    error: function (status, ex) {
        alert("Error Code: Status: " + status + " Ex: " + ex);
    }
});
...