我正在开发一个实现命名处理程序方法的剃刀页面。我将一些JSON编码的数据发布到命名的处理程序方法中。但是,我得到了400错误的请求响应。
到目前为止,我已经尝试使用不同的JSON负载和不同的方法签名,但是,没有任何效果。
以下是我的方法的一个小缺点:
[HttpPost]
public IActionResult OnPostContextFreeGrammarPartial() {
var grammarModel = new ContextFreeGrammarModel();
return new PartialViewResult() {
ViewName = "_ContextFreeGrammar",
ViewData = new ViewDataDictionary<ContextFreeGrammarModel>(ViewData, grammarModel)
};
}
这是一个示例请求:
我期望处理程序方法能够成功执行,但服务器或浏览器甚至在该方法开始执行之前就抛出400响应。
我想念什么?
答案 0 :(得分:1)
您应该将数据传递给OnPostContextFreeGrammarPartial,我认为grammarModel
为空!试试我认为这很有帮助的here
[HttpPost]
[AutoValidateAntiforgeryToken]
public IActionResult OnPostContextFreeGrammarPartial([FromBody]ContextFreeGrammarModel item)
{
var grammarModel = new ContextFreeGrammarModel();
return new PartialViewResult() {
ViewName = "_ContextFreeGrammar",
ViewData = new ViewDataDictionary<ContextFreeGrammarModel>(ViewData, grammarModel)
};
}
以及在startup.cs中:
services.AddMvc(options =>
{
options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
});
答案 1 :(得分:0)
Chris Pratt's comment解释了此问题。请求标头中缺少反伪造令牌-这是Razor页面上发布请求所必需的。
他还建议使用Controller而不是Razor页面。
编辑
在启动过程中向服务添加IgnoreAntiforgeryToken
过滤器也解决了该问题。
services.AddMvc()
.AddRazorPagesOptions(options => {
options.Conventions.ConfigureFilter(new IgnoreAntiforgeryTokenAttribute());
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);