因为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