我有一个标准的silverstripe表单,该表单使用jquery validate来验证必填字段。我需要在提交表单之前执行其他一些验证,因此使用了jquery validate的commithandler来执行ajax请求,如果返回成功结果,请按照以下代码提交表单:
$('form').validate({
rules: {
{**MY FIELD RULES**}
},
submitHandler: function(form) {
$.ajax({
url: {**MY URL**},
success: function(response) {
var resp = JSON.parse(response);
if(resp.ErrorMessage == '') {
form.submit();
} else {
alert(resp.ErrorMessage);
}
},
});
}
});
使用上面的代码提交表单时,将调用Ajax函数并正确返回,但是,提交表单时,我会收到以下消息:
错误[未知类型,错误404]:
发布后{MY FORM URL}
进入
跟踪
=====
SilverStripe \ Dev \ CliDebugView-> renderTrace()
DetailedErrorFormatter.php:119
SilverStripe \ Logging \ DetailedErrorFormatter-> output(404,,,,,)
DetailedErrorFormatter.php:54
SilverStripe \ Logging \ DetailedErrorFormatter-> format(Array)
HTTPResponse.php:355
SilverStripe \ Control \ HTTPResponse-> outputBody()
HTTPResponse.php:283
SilverStripe \ Control \ HTTPResponse-> output()
index.php:26
但是,如果我像这样将表单提交放在ajax调用之前:
$('form').validate({
rules: {
{**MY FIELD RULES**}
},
submitHandler: function(form) {
form.submit();
$.ajax({
url: {**MY URL**},
success: function(response) {
var resp = JSON.parse(response);
if(resp.ErrorMessage == '') {
// form.submit();
} else {
alert(resp.ErrorMessage);
}
},
});
}
});
表单提交正常工作。
我在这个项目中确实有自定义路由,但是我认为这不是问题的原因,因为表单提交在第二个示例中有效。但是,routing.yml如下:
---
Name: myproject
---
SilverStripe\Core\Manifest\ModuleManifest:
project: mysite
SilverStripe\SiteConfig\SiteConfig:
extensions:
- SalonVision\SalonVision\SiteConfigExtension
---
Name: modelascontrollerroutes2
Before:
- '#modelascontrollerroutes'
After:
- '#adminroutes'
- '#graphqlroutes'
---
SilverStripe\Control\Director:
rules:
'$Salon/$Location/$URLSegment//$Action/$ID/$OtherID': 'SalonVision\SalonVision\CModelAsController'
,我正在使用$ form-> setFormAction($ location-> baseLocationURL()。$ form-> FormAction());将正确的$ Salon / $ Location添加到操作URL。
我尝试用$ form-> disableSecurityToken()禁用安全令牌;以防万一是造成问题的原因,但不是欢乐。
此外:
据我了解,当您提交Silverstripe表单时,将调用原始表单方法(生成表单的方法),然后调用表单操作方法。
如果我在浏览器中显示表单页面,然后在form方法的末尾添加php die语句,然后提交表单,则会显示die消息。如果将die消息放置在form action方法的开头,则会显示上面的错误。
这意味着问题必须出在Silverstripe尝试调用form action方法时。我不知道这是如何内部运作的,但是任何想法都将不胜感激。