[英]Best Practices in Razor Pages: Using AJAX or Handlers for post/get requests
[英]Use AJAX POST to return razor pages partial
我已经搜索过这个,尝试了从 stackoverflow 建议的问题中接受的解决方案可能有效,在尝试了我能想到或找到的一切之后,我在这里作为最后的手段。 我想要一个按钮在我的剃刀页面上发送一个帖子请求,通过我必须使用的 ajax 函数,并返回一个没有布局的剃刀页面。
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');
我必须使用的 AJAX 对象添加了以下标头:
Content-type, application/x-www-form-urlencoded
Access-Control-Allow-Origin, *
以及添加一个'?'
后跟一个指向 url 端点的 unix 时间码。
我的理解是请求必须首先发送到 razor 页面后面的 cshtml.cs 类,然后重定向到我的部分。
无论我为 C# 方法命名,onPost、myawesomeurl 还是许多其他名称,我都会收到 404 错误,而不是在myawesomediv
中呈现部分。
我试图添加一个防伪令牌,将服务器上的 CORS 值设置为“全部接受”,并尝试将请求直接发送到部分的 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]
其名称中包含On[Http Method]
以便可以找到它。 如果是 POST 请求,则处理程序方法的名称应为OnPostMyAwesomeUrl
。
您还需要处理 Razor 页面内置请求验证这一事实,因此您需要在 AJAX 请求中包含令牌 ( https://www.learnrazorpages.com/security/request-verification#ajax-post- requests-and-json ),或完全禁用该页面( 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 和端点方法名称匹配的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.