2015-09-15 16 views
6

Tôi đã làm việc trên ứng dụng CRUD và tôi cần xuất dữ liệu từ cơ sở dữ liệu sang tệp csv. Để xuất khẩu, tôi đã vô hiệu hóa ajax, một cách thể hiện trong đoạn mã sau:Điều kiện cung cấp tệp tải xuống hoặc hiển thị thông báo lỗi xác thực xuất

<p:commandButton value="Export" ajax="false" action="myController.export"/> 

Trong phương pháp gọi, tôi có thể tạo các tập tin và tải về nó thông qua phương pháp hữu ích OmniFaces:

Faces.sendFile(file, true); 

Sử dụng cùng một phương pháp, tôi kiểm tra xem có thực sự là bất kỳ dữ liệu, và nếu có được không bất kỳ dữ liệu, thoại cảnh báo được hiển thị:

RequestContext.getCurrentInstance().showMessageInDialog(new FacesMessage(FacesMessage.SEVERITY_WARN, "Warning!", "No available data for export.")); 

Bây giờ, trong khi tất cả những điều này làm việc như dự định, vấn đề là bởi vì ajax bị tắt, hộp thoại không thể được hiển thị động và trang được tải lại. Nếu ajax được bật, hộp thoại được hiển thị động, nhưng quá trình tải xuống tệp không bắt đầu.

Tôi đã cố gắng giải quyết vấn đề này, bằng cách sử dụng Monitor download hoặc bằng cách nhấn vào nút thứ hai, nhưng cho đến nay tôi chưa thực hiện bất kỳ tiến trình nào về vấn đề này.

Có cách nào có thể chấp nhận được để giải quyết các vấn đề như thế này không?

Trả lời

8

Có cách nào có thể chấp nhận được để giải quyết các vấn đề như thế này không?

Bạn về cơ bản muốn cháy một yêu cầu ajax đầu tiên và trong tầm kiểm soát onComplete của nó nếu nó thành công, và sau đó kích hoạt một yêu cầu đồng bộ để tải file (lưu ý rằng bạn can't tải file với ajax). Bạn có thể sử dụng FacesContext#validationFailed() (hoặc OmniFaces Faces.validationFailed()) để đánh dấu trạng thái không hợp lệ có sẵn thông qua đối tượng args mà PrimeFaces chèn vào ngữ cảnh hàm oncomplete (lưu ý rằng các thuộc tính liên quan đến ajax chẳng hạn như oncomplete không hoạt động khi ajax bị tắt).

Something như thế này:

<p:commandButton 
    value="Export" 
    action="#{bean.export}" 
    oncomplete="if (args &amp;&amp; !args.validationFailed) PF('download').jq.click()" /> 
<p:commandButton 
    widgetVar="download" 
    styleClass="ui-helper-hidden" 
    action="#{bean.download}" ajax="false" /> 
public void export() { 
    // Prepare file locally. 

    if (fail) { 
     // Show message your way and then set validation failed as below. 
     Faces.validationFailed(); 
    } 
} 

public void download() throws IOException { 
    Faces.sendFile(file, true); 

    // Delete local file afterwards? 
} 

Lưu ý rằng một ẩn <p:commandButton> đang được sử dụng thay vì <p:remoteCommand> như sau này không hỗ trợ ajax="false".

Các vấn đề liên quan