使用 AJAX POST 到 return 剃须刀页面部分

Use AJAX POST to return razor pages partial

我已经搜索过这个,尝试了 Whosebug 建议的问题中可接受的解决方案,在尝试了我能想到或找到的一切之后,我作为最后的手段来到这里。 我想在我的 razor 页面上有一个按钮来发送 post 请求,通过我必须使用的 ajax 函数,以及 return 一个没有布局的 razor 页面。

HTML

<button id="myawesomebutton">Go get a partial</button>

javascript

 var myawesomeajaxobject=new ajax('/myawesomeurl');
 myawesomeajaxobject.done=function(dat)
 {
  document.getElementById('myawesomediv'),innerHTML=dat
 }
 myawesomeajaxobject.go('myawesomeparameter01=1&myawesomeparameter02=2');

AJAXobject我不得不使用添加如下headers:

   Content-type, application/x-www-form-urlencoded
   Access-Control-Allow-Origin, *

以及向 url 端点添加 '?' 后跟 unix 时间码。

据我所知,请求必须首先发送到剃须刀页面后面的 cshtml.cs class,然后该页面将重定向到我的部分。

无论我如何命名我的 C# 方法、onPost、myawesomeurl、许多其他名称,我都会收到 404 错误,而不是在 myawesomediv.

中渲染部分内容

我试图添加一个防伪令牌,将服务器上的 CORS 值设置为 'accept all' 并尝试将请求直接发送到部分的 onPost,但我一无所获。

更新。

我已添加:

services.AddRazorPages().AddRazorPagesOptions(options =>
{
    options.Conventions.ConfigureFilter(new IgnoreAntiforgeryTokenAttribute());
});

我的初创公司。

我的 javascript 读取:

var myawesomeajaxobject=new ajax('/myawesomeurl');
myawesomeajaxobject.done=function(dat)
{
 document.getElementById('myawesomediv'),innerHTML=dat
}
myawesomeajaxobject.go('handler=myawesomeurl&myawesomeparameter01=1&myawesomeparameter02=2');

这是 cshtml.cs 文件中的处理程序方法:

public void OnPostmyawesomeurl()
{
  //myawesomecoded added, so I have a break point to hit.       
}

而且我仍然收到 404。 这在剃刀页面中真的可行吗?

您似乎正在向命名处理程序方法发出 POST 请求。处理程序仍需要将 On[Http Method] 合并到其名称中,以便可以找到它。如果是POST请求,处理方法的名字应该是OnPostMyAwesomeUrl.

您还需要处理请求验证内置于 Razor Pages 的事实,因此您需要在 AJAX 请求 (https://www.learnrazorpages.com/security/request-verification#ajax-post-requests-and-json), or disable it for that page entirely (https://www.learnrazorpages.com/security/request-verification#opting-out) 中包含令牌:

[IgnoreAntiforgeryToken(Order = 1001)]
public class IndexModel : PageModel
{
    ...
}

谢谢大家的意见。这就是我达到预期结果的方式。

HTML

<button id="myawesomebutton">Go get a partial</button>

javascript

var myawesomeajaxobject=new ajax('/myawesomeurl');
myawesomeajaxobject.done=function(dat)
{
 document.getElementById('myawesomediv'),innerHTML=dat
}
myawesomeajaxobject.go('/shared/myawesomepartial/?handler=myawesomehandler&myawesomeparameter01=1&myawesomeparameter02=2');

启动

services.AddRazorPages().AddRazorPagesOptions(options =>
{
 options.Conventions.ConfigureFilter(new IgnoreAntiforgeryTokenAttribute());
});

myawesomepartial.cshtml.cs

public void OnPostmyawesomehandler(MyAwesomeModel myawesomemodel)
{
  //Do something with myawesomemodel and return myawesomepartial.cshtml
}

这只是使 URL 和端点方法名称匹配的问题。