簡體   English   中英

從下拉框中選擇相應的對象ID時,如何在模型中設置對象引用

[英]How to set object reference in model when respective object id is selected from drop down box

我是Play框架的新手,我試圖保存由管理員查看的用戶信息。 我正在使用表單助手渲染視圖。 視圖中的字段之一是下拉框,該框允許用戶選擇等級級別,該級別具有等級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;
}

調節器

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())

您正在綁定表單,但是之后請檢查userForm是否有錯誤。 必須將其更改為if(submittedForm.hasErrors()) -之后,您將進入if-else語句的true部分。 這有很大的不同!

因此,您的表單確實有錯誤。 這很可能是因為您只給Play提供了一個數字(選擇/選項的value參數),而Play希望它是GradeLevel 如果您打印綁定的表格,您將看到類似以下內容的內容:

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

現在的解決方案是告訴Play如何將“ 2”轉換為GradeLevel

我知道兩個選擇:

1)您可以手動評估綁定的表單-只需使用提供的值創建對象即可。 您可以從數據庫中提取ID為'2'的GradeLevel ,然后創建一個新的/更新現有的UserDetails對象,並將'foo'作為firstName,將'bar'作為lastName,設置userDetails.gradeLevel並保存。

2)看一看https://www.playframework.com/documentation/2.3.x/JavaForms ,尤其是底部帶有自定義DataBinder的部分-您可以為GradeLevel注冊一個DataBinder-記住要這樣做在綁定表格之前。 現在,Play將知道如何處理從“ 2”到GradeLevel對象的轉換,您可以繼續進行。

編輯:請更改視圖的參數列表,以便您接受Map而不是HashMap(例如Map[String,String] )。 這樣,您就不會只限於HashMap 針對接口進行編程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM