Asp.net core 如何从同一页面中的ajax调用指向razor页面的代码隐藏文件中的函数?

Asp.net core 如何从同一页面中的ajax调用指向razor页面的代码隐藏文件中的函数?,asp.net-core,Asp.net Core,我不断得到404。该文件位于Admin/UploadConfirmation.cshtml。URL是localhost:444/Admin/UploadConfirmation。该函数称为CopyData 但是当我试图对它进行ajax调用时,它只是404 $.ajax({ type: "POST", url: "/Admin/UploadConfirmation/CopyData" 如何从cshtml文件向其自己的

我不断得到404。该文件位于
Admin/UploadConfirmation.cshtml
。URL是
localhost:444/Admin/UploadConfirmation
。该函数称为
CopyData

但是当我试图对它进行ajax调用时,它只是404

    $.ajax({
        type: "POST",
        url: "/Admin/UploadConfirmation/CopyData"
如何从cshtml文件向其自己的cshtml.cs文件进行ajax调用

如何从cshtml文件向其自己的cshtml.cs进行ajax调用 档案

请参考以下步骤和示例代码:

  • 在Razor应用程序中,创建管理区域并添加索引页:

  • 配置区域页面路由和反伪造服务

     public void ConfigureServices(IServiceCollection services)
     {
         services.AddRazorPages() 
             .AddRazorPagesOptions(options =>
             {
                 options.Conventions.AddAreaPageRoute("Admin", "/Index", "Admin");
             }); 
         services.AddAntiforgery(o => o.HeaderName = "XSRF-TOKEN");  //configure the antiforgery service to look for the X-CSRF-TOKEN header. To prevent the cross-site request forgery.
     }
    
  • 创建PersonModel模型:

     public class PersonModel
     {
         public string Name { get; set; }
    
         public string DateTime { get; set; }
     }
    
  • 在Index.cshtml.cs页面中。添加处理程序方法(OnPostGetTime)来处理Ajax请求

     namespace RazorSample.Areas.Admin.Pages
     {
         public class IndexModel : PageModel
         {
             public void OnGet()
             {
             }
    
             public IActionResult OnPostGetTime(string name)
             {
                 PersonModel person = new PersonModel
                 {
                     Name = name,
                     DateTime = DateTime.Now.ToString()
                 };
                 return new JsonResult(person);
             }
         }
     }
    
    然后,在Index.cshtml页面中,使用以下代码显示并调用handle方法:

     @page
     @{
         Layout = "~/Pages/Shared/_Layout.cshtml";
     }
     @model RazorSample.Areas.Admin.Pages.IndexModel
    
     <h2>Admin Index Page</h2>
     <div class="container">
    
         @Html.AntiForgeryToken()
         <input type="text" id="txtName" />
         <input type="button" id="btnGet" value="Get Current Time" />
         <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
         <script type="text/javascript">
             $(function () {
                 $("#btnGet").click(function () {
                     $.ajax({
                         type: "POST",
                         url: "/Admin/Index?handler=GetTime",
                         beforeSend: function (xhr) {
                             xhr.setRequestHeader("XSRF-TOKEN",
                                 $('input:hidden[name="__RequestVerificationToken"]').val());
                         },
                         data: { "name": $("#txtName").val() }, 
                         success: function (response) {
                             alert("Hello: " + response.name + " .\nCurrent Date and Time: " + response.dateTime);
                         },
                         failure: function (response) {
                             alert(response.responseText);
                         },
                         error: function (response) {
                             alert(response.responseText);
                         }
                     });
                 });
             });
         </script>
     </div>
    
    @page
    @{
    Layout=“~/Pages/Shared/_Layout.cshtml”;
    }
    @模型RazorSample.Areas.Admin.Pages.IndexModel
    管理索引页
    @Html.AntiForgeryToken()
    $(函数(){
    $(“#btnGet”)。单击(函数(){
    $.ajax({
    类型:“POST”,
    url:“/Admin/Index?handler=GetTime”,
    发送前:函数(xhr){
    xhr.setRequestHeader(“XSRF-TOKEN”,
    $('input:hidden[name=“\uu RequestVerificationToken”]”)val();
    },
    数据:{“name”:$(“#txtName”).val(),
    成功:功能(响应){
    警报(“你好:+response.name+”\n当前日期和时间:+response.dateTime);
    },
    故障:功能(响应){
    警报(response.responseText);
    },
    错误:函数(响应){
    警报(response.responseText);
    }
    });
    });
    });
    
    [注意]在Razor页面模型中,处理程序方法名为OnPostGetTime,但在这里,当从Razor HTML页面调用时,它将被指定为GetTime

  • 结果如下:

    参考:


    看起来您使用的是区域,而没有区域的常规路由配置(当然也没有属性路由)。您不能对razor页面使用属性路由。我不熟悉的领域。感谢您的详细回答,但这将不会与现有的应用程序集成。我最终只是创建了一个控制器。剃须刀页面是哑的。