2013-02-06 29 views
8

Tôi có trường hợp sử dụng cụ thể để xác thực JSF. Ví dụ tôi có một inputText lĩnh vực:Xác thực đầu vào theo yêu cầu chỉ khi nhấn một nút lệnh nhất định

<p:inputText id="input" required="#{myBean.required}" value="#{myBean.value}" maxlength="20" disabled="#{myBean.disabled}"> 
    <p:ajax event="blur" process="@this" update="name" listener="#{myBean.listener}"/> 
</p:inputText> 

Giá trị của đầu vào là số (trong một số trường hợp, nó cũng có thể là một chuỗi, bởi vì đây là một phần của thành phần composite, nhưng vấn đề được mô tả tốt hơn nếu chúng ta giả định đây là một con số). đầu vào này là một phần của hình thức, ở phần cuối của mẫu I có nút gửi:

<p:commandButton value="Save" actionListener="#{myBean.save}"/> 

yêu cầu của tôi là gì:

  1. Khi nút gửi được nhấn tất cả các xác nhận phải được xử lý và điều này là OK , điều này hoạt động tốt.
  2. Khi sự kiện mờ được kích hoạt trên trường nhập nếu trường không trống, việc xác thực số sẽ được xử lý và điều này cũng là OK. Ở cuối, tôi cập nhật trường với id name với một số giá trị.
  3. Bây giờ tôi gặp sự cố. Yêu cầu thứ ba của tôi là khi đầu vào là xác nhận trống trên đầu vào không nên được xử lý. Đây là trường hợp đặc biệt, trong đó tôi sẽ xóa trường bằng id name. Đây cũng là trường hợp khi tôi xóa văn bản đã được nhập vào, xóa tiêu điểm khỏi thành phần (nhấn TAB chẳng hạn) và trong trường hợp đó yêu cầu AJAX cũng nên được xử lý và nhập tên cũng sẽ bị xóa.

Làm cách nào để vô hiệu hóa xác thực của trường nhập này trong trường hợp nó trống và chỉ cho sự kiện ajax này?

Trả lời

10

Hãy để của required đầu vào thuộc tính kiểm tra xem nút lưu được nhấn hay không (có thể được xác định bởi sự hiện diện của khách hàng của mình ID trong bản đồ tham số yêu cầu).

<h:form> 
    <p:inputText ... required="#{not empty param[save.clientId] and myBean.required}" /> 

    <p:commandButton binding="#{save}" ... /> 
</h:form> 

(lưu ý: làm không ràng buộc nó vào một tài sản đậu mã này là như-là)

Bằng cách này nó sẽ chỉ đánh giá true khi nút lưu thực sự là ép.

Hoặc, nếu bạn có vấn đề với binding và/hoặc không có một vấn đề hardcoding ID khách hàng của nút:

<h:form id="formId"> 
    <p:inputText ... required="#{not empty param['formId:buttonId'] and myBean.required}" /> 

    <p:commandButton id="buttonId" ... /> 
</h:form> 
+0

Bạn cho rằng việc xác thực yêu cầu sẽ bị bỏ qua trong trường hợp đó? Tại sao? – partlov

+0

Miễn là bạn không điền (và do đó thay đổi) đầu vào, xác thực sẽ không bị kích hoạt khi bị nhòe. – BalusC

+0

Có lẽ tôi không rõ ràng với trường hợp sử dụng cụ thể trong yêu cầu thứ ba. Tôi đã chỉnh sửa nó. Người dùng có thể (có thể vô tình) xóa văn bản và trong trường hợp tên đầu vào đó sẽ bị xóa. – partlov

2

Chỉ cần xóa thuộc tính bắt buộc khi bạn chấp nhận đầu vào nếu đầu vào trống. Sau đó viết trình xác thực tùy chỉnh chỉ chấp nhận đầu vào trống hoặc đầu vào số.

<p:inputText id="input" value="#{myBean.value}" maxlength="20" disabled="#{myBean.disabled}" validator="customerNumericInputValidator"> <p:ajax event="blur" process="@this" update="name" listener="#{myBean.listener}"/> </p:inputText> 

public class customerNumericInputValidator thực hiện Validator {

@Override 
public void validate(FacesContext facesContext, UIComponent uIComponent, 
     Object object) throws ValidatorException { 

    String number = (String) object; 
    number = Strings.nullToEmpty(number).trim(); 

    //if the request is a full request then number can not be empty 
    if(!FacesContext.getCurrentInstance().isPostback() && Strings.isNullOrEmpty(number)) 
    { 
     FacesMessage message = new FacesMessage(); 
     message.setSummary(Messages.getMessage("error empty value")); 
     message.setSeverity(FacesMessage.SEVERITY_ERROR); 
     throw new ValidatorException(message); 
    } 

    if(!Strings.isNullOrEmpty(number)) 
    { 
     if(!isNumber(number)) 
     { 
      FacesMessage message = new FacesMessage(); 
      message.setSummary(Messages.getMessage("error not numerical value")); 
      message.setSeverity(FacesMessage.SEVERITY_ERROR); 
      throw new ValidatorException(message); 
     } 
    } 
} 

}

+0

Nhưng cần xác nhận nên được xử lý trong trường hợp khi mẫu được gửi với 'commandButton'. – partlov

+0

Khi biểu mẫu được gửi bằng commandButton trình tùy chỉnh của bạn sẽ được thực hiện và nó sẽ ném một ngoại lệ nếu giá trị đã nhập không phải là số; nhưng nó sẽ không phàn nàn nếu đầu vào trống. – cubbuk

+0

OK, theo yêu cầu 1 Tôi đã viết rằng khi biểu mẫu được gửi bằng nút, bắt buộc không được bỏ qua!Chúng tôi có thể nói rằng trường là bắt buộc khi gửi bằng nút nhưng không được yêu cầu khi gửi với ajax trên sự kiện làm mờ. – partlov