0

コントローラーで選択した値を取得しようとしていますが、機能しません。

私の見解では、フォームがあります:

@(infoObjectForm: Form[Infoobject],nav: String = "")

@form(routes.Admin.admin_createMapInstance()) {
        <fieldset>
        @select(
                infoObjectForm("infoobjectId"), 
                options(Infoobject.all_values), 
                'id -> "infoobjects_field",
                '_label -> "Infoobject", '_default -> "--Select Infoobject--",
                '_showConstraints -> false, 'value -> infoObjectForm
            )
        </fieldset>

        <div class="actions">
            <input type="submit" value="Create this Map Instance" class="btn primary"> or 
            <a href="@routes.Admin.admin_MapInstance()" class="btn">Cancel</a> 
        </div>
    }

このドロップダウンには、すべての情報オブジェクトが表示されます。1 つを選択して送信ボタンを押すと、選択した infoobject (およびそのプロパティ) をコントローラーで使用したいと考えています。

Form<Infoobject> mapForm = form(Infoobject.class).bindFromRequest();
        if(mapForm.hasErrors()) {
            flash("error", "MapForm contains an error");
            return badRequest(createMapForm.render(mapForm, ""));
        }
Infoobject infoobject = mapForm.get();
String desig = infoobject.getDesignation();
String desc = infoobject.getDescription();
...

mapForm にエラーがあります。どうしてか知ってる?

インフォオブジェクト モデル:

@Entity
public class Infoobject extends Model {
@Id
    @SequenceGenerator(name="infoobject_seq", sequenceName="infoobject_id_seq", allocationSize=1000)
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="infoobject_seq")
    public Long infoobjectId;

    @Required
    public String designation;
    @Required
    public String description;
        ...getters/setters

ビューで 2 つの @inputText フィールドを使用しようとしたので、機能する情報オブジェクトを作成できました。しかし今は、既存の情報オブジェクトのマップ インスタンスを作成したくありません。

あなたの助けに感謝!

編集:「error.required」と言って、コンソールにエラーを出力しました。誰?フォームに Infoobject が含まれていないようです。この類似の質問/回答が見つかりました..では、なぜこれが機能しないのですか?

4

2 に答える 2

0

@select タグに infoObjectForm("infoobjectId") を入れます

モデル クラスの Infoobject に次を追加します。

static {
    play.data.format.Formatters.register(Infoobject.class, new ClassFormatter());
}

public static class ClassFormatter extends SimpleFormatter<Infoobject> {

    @Override
    public Infoobject parse(String text, Locale locale) {
        if (text == null || text.trim().length() == 0)
            return null;
        return Infoobject.find.byId(Long.parseLong(text.trim()));
    }

    @Override
    public String print(Infoobject value, Locale locale) {
        return (value == null || value.id == null ? "" : value.id.toString());
    }
}
于 2013-11-22T14:03:33.583 に答える
0

このソリューションは機能しますが、これが最善の方法だとは思いません。

<form>
        @select(
                infoObjectForm("infoobjectId.id"), 
                options(Infoobject.all_values), 
                'id -> "infoobjects_field",
                '_label -> "Infoobject", '_default -> "--Select Infoobject--",
                '_showConstraints -> false
            )
        <div class="actions">
            <input type="button" value="Create this Map Instance" class="btn primary" onclick="JavaScript:createMap()"> or 
            <a href="@routes.Admin.admin_MapInstance()" class="btn">Cancel</a> 
        </div>
    </form>
    <script>
        function createMap() {
            var ioId = document.getElementById('infoobjects_field').value;
            if(ioId) {
                var nextUrl = "/CreateMapInstance?ioId="+ioId;
                window.location = nextUrl;
            }
        }
    </script>

POST で infoobject 全体を送信するのではなく、GET を実行して URL で ID のみを送信します。

于 2013-11-11T10:25:59.947 に答える