即使使用ajax提交表单也无法阻止刷新

时间:2019-01-08 07:18:41

标签: javascript html ajax liferay portlet

我正在编写Portlet函数,以便将excel文件上传到后端进行处理。

我希望页面不会刷新,并允许我在成功上传后更改页面。

我尝试使用Ajax上传文件,但无法正常工作。

html部分

<portlet:actionURL var="uploadWorkbook" name="uploadWorkbook"></portlet:actionURL>
<b>Please Upload a Document</b> 

 <form id = "UploadExcelForm" name ="UploadExcelForm" action="<%=uploadWorkbook%>" method="post" enctype="multipart/form-data">
<input type="file" id="uploadedFile" name="uploadedFile" accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel">
<button type="submit"> Upload </button>
</form>

ajax部分

$("#UploadExcelForm").on('submit', (function(e) {
   if ($('#uploadedFile').val().trim().length == 0) {
        alert("Please choose a file!");
        return false;
    }else{
            $.ajax({
            url: uploadWorkbook,
            type: 'POST',
            cache: false,
            data: $('#UploadExcelForm').serialize(),
            processData: false,
            contentType: false,
            success: function(){}
        })
        e.preventDefault();
}
}));

后端部分(如何获取上传的文件)

public void uploadWorkbook(ActionRequest actionRequest,ActionResponse actionResponse) throws Exception{
        boolean submit = true;
        boolean success = false;
        UploadPortletRequest uploadPortletRequest = PortalUtil.getUploadPortletRequest(actionRequest); 
        String uploadedTemplateId = uploadPortletRequest.getParameter("templateId");

        File uploadedFile = uploadPortletRequest.getFile("uploadedFile", true); 
//to do sth on file...
}

5 个答案:

答案 0 :(得分:0)

尝试删除表单标签并从按钮中删除类型提交。

答案 1 :(得分:0)

type="submit"更改:

<button type="submit"> Upload </button>

收件人:

<button> Upload </button>

答案 2 :(得分:0)

尝试从表单标签中删除action

然后使用e.preventDefault()而不是return false并将其放在if/else语句之外。

答案 3 :(得分:0)

更改:

<button type="submit"> Upload </button>

<button type="button"> Upload </button>

然后放

e.preventDefault();

如果条件外(因此对两个都执行)

答案 4 :(得分:0)

其他答案在JS方面为您提供了一些提示,您应该遵循这些提示。在门户方面,您将发布到<portlet:actionURL/>,它将返回一个完全渲染的页面(甚至可能被Liferay的SPA框架拦截-尽管我不确定它是否处理显式的ajax调用。

如果您只想返回文件上传的结果(例如状态,JSON等),则可能要发布到<portlet:resourceURL/>,并在Java端的资源处理程序中进行处理,而不是动作处理程序。

发布到资源处理程序将不会呈现页面上的所有其他portlet,而操作处理程序则可以。