我想对我的控制器的操作进行ajax调用。问题在于我得到了错误
"对不起,找不到请求的视图。找不到模板。在类XY中的Action XY无法解决"视图"
多数民众赞成在我的ajax呼叫:
$.ajax({
type: 'POST',
url: '<f:uri.action action="xy" controller="XY"/>',
success: function(data){
console.log(data);
}
});
那是我的控制器的动作方法:
public function xyAction(){
if ($this->request->hasArgument("import") && $_FILES["import"]['error'] == 0) {
$file = $this->request->getArgument("import");
$ext = pathinfo($file['name'], PATHINFO_EXTENSION);
if ($ext != "csv") {
$this->addFlashMessage('Falsche Dateiendung, es sind nur CSV-Dateien gültig.', '', TYPO3CMSCoreMessagingAbstractMessage::ERROR);
}
$participantsArray = $this->parseCSV($file["tmp_name"]);
return json_encode($participantsArray);
}else {
$this->addFlashMessage('Keine Datei ausgewählt', '', TYPO3CMSCoreMessagingAbstractMessage::ERROR);
}
}
方法的返回值 parsecsv($ file(是一个数组。
预先感谢。
假设您由于某种原因不希望使用Typo3提供的JSONVIEW,您将需要:
- 模板,即使是空的,在预期的位置。如果不存在,则extbase甚至在加载控制器之前就会失败。
- 手动创建响应内容,例如由
return json_encode($var)
从您的控制器操作中。
逻辑是:如果方法返回null,则视图将呈现。如果它返回其他任何内容(暗示:非空字符串(,则将用作响应,并且视图不会呈现。本质上:不从该方法返回任何内容意味着return $this->view->render();
从父级控制器类中调用。
由于控制器调度程序无法事先知道您不希望视图渲染,因此如果无法解析模板,它将失败。
这也是让您知道如何解决此问题的提示。将视图类更改为您创建的类别,或者不在乎一个模板文件是否存在,这是解决此问题的另一种方法。有几种方法,但最常见的是,将控制器中的protected $defaultViewObjectName
设置为自定义视图的类名,如果找不到模板,则不会失败。
关于标题,您可能还需要更改响应内容类型。您如何执行此操作将取决于您的确切实现 - 使用Typoscript做到这一点可能是有意义的,而不是将其设置为$ this->响应。
您可能想尝试
echo json_encode($participantsArray);
die();
而不是return json_encode($participantsArray);
这是由于在扩展模板文件夹上找不到的xy.html
模板而发生的。因此,您需要做以下类似的事情。
您需要在return json_encode()
行之后添加die()
功能。
其他明智的您需要为此操作创建空白模板文件,例如xy.html