忽略不同视图下的播放框架表单错误

问题描述 投票:2回答:3

我想知道在我想要的时候是否可以忽略播放标准验证。例如,让我们假设我有一个名为Car的实体就像

@Entity
public class Car{

   @Id
   private Long id;

   @Required
   private String model;

   @Required
   private String hiddenField; //important but doesn't appear in some cases (some usecases)

}

为了使它更清楚,那么

情况1

@(carForm : Form[Car])
@import helper._

@form(routes.controller.foo.bar) {
    @inputText(carForm("model"))
    <input type="submit">
}

案例2

@(carForm : Form[Car])
@import helper._

@form(routes.controller.foo.bar) {
    @inputText(carForm("model"))
    @inputText(carForm("hiddenField"))
    <input type="submit">
}

然后我有一个Play.data.Form对象,它有错误,因为我没有填充模型或作为exmple给出的hiddenField。但是,实际上,我有一些情况,这隐藏甚至不出现(案例1),我的意思是,没有输入调用,因为用户不允许在那个时间编辑它。所以,如果我有两个用例,在第一个,所有输入都在那里,它们应该被填充,但另一个没有'hiddenField'输入,但是,altought,它仍然需要我的模型,以及当然,没有它提交的表格也有错误,我该怎么办?我怎么应该处理它?我有一个模型,但验证在一种情况下可能会有所不同,我希望它是服务器端,而不是jquery也不是纯粹的javascript。

我试图通过丢弃错误(想象一下,它是从案例1中提交的)

MyForm<Car> myCarForm = Form.form(Car.class).bindFromRequest();
//it has errors, sure it does, hiddenField was required and that field didn't even exist at screen.
myCarForm.discardErrors(); //ok, error hashmap is empty right now
myCarForm.get(); // anyway, no value here.
//myCarForm.data(); //for sure i could retrieve field by field and remount object that way, but that looks hacky and hardworking

那么,任何解决方案?谢谢大家

forms validation playframework
3个回答
2
投票

我读了Play for Java书。

6.4.2部分验证

常见用例是对同一对象模型具有多个验证约束。因为我们在对象模型上定义了约束,所以有多个表单引用相同的对象模型是很正常的。但是这些形式可能具有不同的验证限制。为了说明这个用例,我们可以设想一个简单的向导,用户可以通过两个步骤输入新产品:

  • 1用户输入产品名称并提交表单。
  • 2用户输入产品EAN编号和说明。

我们可以在步骤2中验证产品的名称,但在该点显示产品名称的错误消息会很奇怪。幸运的是,Play允许您执行部分验证。对于每个带注释的值,我们需要指出它适用于哪个步骤。我们可以借助我们的注释中的groups属性来做到这一点。让我们改变我们的产品模型类来做到这一点:

public Product extends Model {
public interface Step1{}
public interface Step2{}
@Required(groups = Step1.class)
public String name;
@Required(groups = Step2.class)
public String ean;
}

然后,在控制器

// We re//strict the validation to the Step1 "group"
Form<Product> productForm =
form(Product.class, Product.Step1.class).bindFromRequest();

谢谢!


1
投票

是的,您可以实现此问题的解决方案。在这种情况下发生的是每次将您的请求映射到模型汽车时,它总是会查找每个属性的JPA验证,然后它会查找该模型中存在的validate()方法,如果该方法返回null则它不会传递任何错误并执行正常执行,但如果它返回任何内容,则将其映射到表单错误。您可以将错误映射返回到特定字段,或者只返回一个将被视为全局错误的字符串。

在您的情况下解决方案是:

@Entity
public class Car{

   @Id
   private Long id;

   private String model;

   private String hiddenField; //important but doesn't appear in some cases (some usecases)

   public List<ValidationError> validate() {
    List<ValidationError> errors = new ArrayList<ValidationError>();
            .
            .
            .
            #Some logic to validate fields#
            #if field invalid#
                 errors.add(new ValidationError("model", "errorMessage"));
            .
            .
            .

            return errors.isEmpty() ? null : errors;
}

注意:只需删除JPA验证并使用验证功能中的逻辑来根据情况进行检查。


0
投票

忽略验证,如下所示:

myCarForm.discardErrors().get();

然后进行验证,例如Jquery。

© www.soinside.com 2019 - 2024. All rights reserved.