【问题标题】:Form validation in Play 2.0Play 2.0 中的表单验证
【发布时间】:2012-03-29 14:10:53
【问题描述】:

好的,所以我在从表单获取数据以绑定到我拥有的模型类时遇到了一些问题。

我有一个基本上看起来像这样的课堂问题:

@Entity  
public class Question extends Model {
     @Id @Required public int id;
     public String title;
     public String body;
     ...methods...
}

所以我想将其用作用户创建问题的表单模板,因此我创建了一个静态实例(就像他们在示例中所做的那样)

 final static Form<Question> question_form = form(Question.class);

到目前为止一切顺利,一切都编译好了。当我实际提交表单时,问题就来了:

 Form<Question> filled_form = new Form<Question>(Question.class).bindFromRequest();

这里我得到了错误:

 [UnexpectedTypeException: No validator could be found for type: java.lang.Integer]

我对如何进行的想法是使用如下设计模式:

1.) 专门为表单创建模板类,不包含外键、ID 和非为用户设计的格式的信息等内容。 (即如果Question 有一个Topic 的外键,那么QuestionForm 类将有一个String topic 字段。

2.) 在Question 模型中创建一个类似于getFormForQuestion(Question)getQuestionForForm(Form&lt;Question&gt;) 的方法,然后使用这些方法执行CRUD 功能。

所以基本上用户和控制器使用表单进行交互,然后模型知道如何获取这些表单并将它们转换为数据库中的条目。

这是一种合理的方法吗?或者有更好的方法吗?

更新:

使用@GeneratedValue 注释而不是@Required 注释时似乎已修复,但我仍然对我提出的表单设计模式感到好奇。

也只是删除@Required 似乎可以解决问题。仍在寻找上述设计模式的 cmets!

【问题讨论】:

  • 您不需要id,因为它继承自Model 超类。
  • 哦,太棒了,我想更好。谢谢
  • 这解决了您的问题吗?我应该把它作为这个问题的答案发布吗?
  • 是的,这似乎也行得通,可能是正确的解决方案而不是使用@GeneratedValue注解,你认为我提到的设计模式有一个很好的设计模式吗?

标签: forms model-view-controller model playframework


【解决方案1】:

id 字段不需要任何验证,ORM 会关心它。当然,您不应该将 id 放在表单中(根本不应该对其进行编辑 - 这是常见的 AUTO_INCREMENT)并且最好将其设为 Long,只需:

@Id
public Long id;

【讨论】:

  • 我提到的设计模式上的任何cmets?
  • @weezybizzle 我不确定我是否理解得很好,但是如果没有声明这个字段,Ebean 不会创建任何 ID 字段... :) 在大多数情况下这只是无用的。
  • 好的,我会单独发布这个设计模式。
猜你喜欢
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
相关资源
最近更新 更多