gpt4 book ai didi

java - 当从下拉框中选择相应的对象 ID 时,如何在模型中设置对象引用

转载 作者:行者123 更新时间:2023-11-30 03:45:02 26 4
gpt4 key购买 nike

我是 Play 框架的新手,我正在尝试保存管理员在 View 中输入的用户信息。我正在使用表单助手渲染 View 。 View 中的字段之一是下拉框,它允许用户选择年级,其中包含年级 ID 值,显示文本包含年级名称。在我的用户模型中,我的字段为 GradeLevel,它引用 GradeLevel 模型。我不知道从下拉框中选择相应的成绩 ID 时如何设置 GradeLevel 对象。现在它抛出非法状态异常:提交表单时没有值。

下面给出了代码片段。

查看

@(userForm: Form[UserDetails],gradeMap: HashMap[String,String])

@import helper._

@main("Sample") {

<h1>Add User</h1>

@form(action = routes.UserController.validate()){

@inputText(userForm("firstName"), '_label -> "Firstname",'_showConstraints -> false)
@inputText(userForm("lastName"), '_label -> "Lastname",'_showConstraints -> false)
@select(userForm("gradeLevel"), options(gradeMap), '_label -> "Grade/Tier")

<input type="submit" class="btn btn-primary" value="Save">
}
}

用户模型

@Entity
@Table(name="user")
public class UserDetails extends Model
{
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
public int id;

@Column(length = 40, nullable = false, name = "first_name")
//@Constraints.Required
public String firstName;

@Column(length = 40, nullable = false, name = "last_name")
//@Constraints.Required
public String lastName;

@JoinColumn(nullable = false, name = "level_id")
@ManyToOne(fetch = FetchType.LAZY)
public GradeLevel gradeLevel;
}

等级模型

@Entity
@Table(name="grade_level")
public class GradeLevel extends Model
{
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
public int id;

@Column(length = 40, nullable = false)
@Constraints.MinLength(2)
@Constraints.MaxLength(40)
public String name;
}

Controller

public static Result validate()
{
Form<UserDetails> submittedForm = userForm.bindFromRequest();

if(userForm.hasErrors())
{
return redirect(routes.SessionController.home());
}
else
{
UserDetails userDetails = null;
try
{
userDetails = submittedForm.get();
}
catch (IllegalStateException illegalException)
{
Logger.error("IllegalStateException",illegalException);
return redirect(routes.SessionController.home());
}
userDetails.save();

return redirect(routes.UserController.show());
}
}

最佳答案

您的代码中存在一些缺陷,但第一个大问题在这里:

Form<UserDetails> submittedForm = userForm.bindFromRequest();

if(userForm.hasErrors())

您正在绑定(bind)表单,但随后检查userForm是否有错误。必须将其更改为 if(subscribedForm.hasErrors()) - 之后您将进入 if-else 语句的 true 部分。这有很大的不同!!

所以您的表单确实有错误。这很可能是因为您只给 Play 提供了一个数字(您的选择/选项的值参数),而 Play 期望它是一个 GradeLevel。如果您打印绑定(bind)表格,您将看到类似以下内容:

Form(of=class models.UserDetails, data={lastName=bar, gradeLevel=2, firstName=foo},

现在的解决方案是告诉 Play 如何将这个“2”转换为 GradeLevel

我知道有两个选择:

1) 您可以手动评估绑定(bind)表单 - 只需使用提供的值创建对象即可。您可以从数据库中提取 ID 为“2”的 GradeLevel,然后创建一个新的/更新现有的 UserDetails 对象,其中“foo”为名字,“bar”为姓氏,设置 userDetails.gradeLevel 并保存。

2) 看看 https://www.playframework.com/documentation/2.3.x/JavaForms特别是底部带有自定义 DataBinder 的部分 - 您可以为 GradeLevel 自己注册一个 DataBinder - 只需记住在绑定(bind)表单之前执行此操作即可。现在 Play 将知道如何处理从“2”到 GradeLevel 对象的转换,您可以继续。

编辑:请更改 View 的参数列表,以便接受 Map 而不是 HashMap(如 Map[String,String])。这样您就不会仅限于 HashMap。针对接口(interface)进行编程。

关于java - 当从下拉框中选择相应的对象 ID 时,如何在模型中设置对象引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25969072/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com