因为Razor自动集成了自定义mvc,因此razor对于js调用Page后台代码有固定写法.
其中建立的方法名即表明请求的类型,而不能使用mvc的[HttpPost]/[HttpGet]修饰符.
OnGetFunc1 OnGetFunc1Async
在当前cshtml页面js中调用的地址为 ?handler=Func1
其中handler也是固定好了的.要求ajax使用get方式请求
同理OnPostFunc1 OnPostFunc1Async
要求ajax使用post方式请求
对于post请求,razor自动生成了header安全验证.ajax在调用前需要添加token头.
将下面的代码加入_layout.cshtml母版页文件,添加的token即对所有的post请求生效.
@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf @functions { public string GetAntiXsrfRequestToken() { return Xsrf.GetAndStoreTokens(Context).RequestToken!; } } <script> var csrfToken = '@GetAntiXsrfRequestToken()'; (function (window, document, $) { $.ajaxSetup({ headers: { 'RequestVerificationToken': csrfToken } }); })(window, document, jQuery); </script>
后台代码示例:
public async Task<ActionResult?> OnGetMatchListAsync(string puuid, ServerPlatform platform = ServerPlatform.KR, int start = 0, int count = 20) { try { ..... var result = JsonConvert.DeserializeObject<List<string>>(json); return new JsonResult(result); } catch (Exception ex) { Debug.WriteLine(ex.Message); return null; } }注意:方法返回值也只能是ActionResult
我理解为razor是mvc的定制.比mvc方便简洁有条理但不如mvc灵活.如灵活性不满足要求,仍可使用mvc.
end