5

ドメインオブジェクトに整数として定義するフィールドがあります...

Integer minPrice

次に、GSPページで次のようにアクセスします。

${fieldValue(bean: myBean, field: 'minPrice')}

HTMLで取得するのは...

100,000

これは整数ではなく、文字列です。さらに悪いことに、それは特定のロケールでフォーマットされた文字列です。

ドメインオブジェクトに整数として格納したいminPriceの(非序数の)値の範囲を持つHTML FORMにSELECTコントロールがあり、インデックスを格納したくないため、これは問題です。値の配列を繰り返しマップする必要がありますが、値自体が必要です。

私の選択コントロールは次のようになります...

<g:select name="minPrice" 
value="${fieldValue(bean: personInstance, field: 'minPrice')}"  
onchange="setDirty()"
noSelection='${['0':'Select a number...']}'
from="${[
    ['name':'100,000', 'id':100000],
    ['name':'200,000', 'id':200000],
    ['name':'300,000', 'id':300000]
    ]}"
optionKey="id" optionValue="name"
/>

SELECTフィールドから値を取得してサーバーにポストバックすると、整数値が正しく保持されます。ただし、値はこのコンマ区切りの文字列であるため、リターントリップでドロップダウンの右側の行が事前に選択されることはありません。

これは、コンマの書式設定が機能せず、SELECTの出入りが成功する小さな数値の場合、コードの他の場所で正常に機能します。ただし、999を超える値は機能しません。

ドキュメントには、「このタグは、データバインディングの対象となっているBeanを検査し、データバインディング中に入力されるBeanのエラーオブジェクトに含まれる最初に送信された値から、またはBeanのプロパティの値からフィールドの値を取得します。値が取得されると、自動的にHTMLエンコードされます。」

整数をフォーマットしているように見えるので、避けたいのはその最後のビットです。では、整数を整数としてSELECTにレンダリングし、正しい行を事前に選択できるようにするには、Grails / GSPの魔法について少し知っておく必要がありますか?

編集: 私は以下の答えに基づいてさらにいくつかのことを試みましたが、これまでのところかなり残念な結果がありました...

<gformatNumber/>タグを自分の中に入れる<g:select/>と、ブラウザにテキストとしてページコードが表示されます。

<g:select name="minPrice" 
value='<g:formatNumber number="${fieldValue(bean: personInstance, field: 'minPrice')}" format="#" />'
onchange="setDirty()"
noSelection='${['0':'Select a number...']}'
from="${[
['name':'100,000', 'id':100000],
['name':'200,000', 'id':200000],
['name':'300,000', 'id':300000],
]}"
optionKey="id" optionValue="name"
/>

このように100000の整数値でGSPの数値フォーマットタグを使用しています...

var x = <g:formatNumber number="${fieldValue(bean: personInstance, field: 'minPrice')}" format="#" />;

与える100fieldValueギブバックを覚えておいてください100,000、それでこれは驚きではありません。

このようにjsptaglibを使用すると...

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
var y = <fmt:formatNumber value="${fieldValue(bean: personInstance, field: 'minPrice')}" pattern=".00"/>;

ページコンパイラからエラーが発生しますCannot format given Object as a Number

fieldValueディレクティブのデフォルトの(および構成不可能な)動作のために、整数値が999より大きい場合、コードに本物の整数として整数値を取得できないように見えるよりも、私はより広い懸念を持っていると思います。ただし、SELECTコントロールで整数値を事前に選択できないという私の特定の問題は解消されていません。現時点では少し途方に暮れています。

誰か他にアイデアはありますか?

4

8 に答える 8

8

生の数値を表示しますか? 100000くらい?

フィールドを直接取得できます。

${myBean.minPrice}
于 2010-12-15T18:41:06.047 に答える
5

少なくとも2つの可能な解決策があると思います。

1 つは、ドキュメントで説明されているように JSTL taglib を使用することです。

もう 1 つのクールな方法は、grails に含まれている 'formatNumber' タグを使用することです (これもdocsにあります) 。

あなたの目的のために、そのタグの使用は次のようになります。

<g:formatNumber number="${fieldValue(bean: myBean, field: 'minPrice')}" format="######" />
于 2010-01-21T11:48:13.950 に答える
3

値を出力するたびにタグを気にしないようにするには、カスタム PropertyEditorを使用することをお勧めします。formatNumber同様に、resources.groovy で Bean を宣言します。

myOwnCustomEditorRegistrar(CustomEditorRegistrar)

クラスを作成します。

class CustomEditorRegistrar implements PropertyEditorRegistrar {
    void registerCustomEditors(PropertyEditorRegistry registry) {
        registry.registerCustomEditor(BigDecimal.class, new MyBigDecimalEditor(BigDecimal.class))
    }
}
于 2010-12-14T14:40:02.730 に答える
1

これを処理する最良の方法は、Victor Sergienko(upped btw)がPropertyEditorを使用して示唆したことを実行することでした。

整数用のエディターを作成し、src/groovyに配置します。

class IntegerEditor extends PropertyEditorSupport {
    void setAsText(String s) {
        if (s) value = s as Integer
    }

    public String getAsText() {
        value
    }
}

PropertyEditorRegistrar(src / groovyにもあります)を使用して登録します。

class MyEditorRegistrar implements PropertyEditorRegistrar {
    public void registerCustomEditors(PropertyEditorRegistry reg) {
        reg.registerCustomEditor(Integer, new IntegerEditor())
    }
}

レジストラをSpring構成(grails-app / conf / spring / resource.groovy)に追加します。

beans = {
    customEditorRegistrar(MyEditorRegistrar)
}

今後、バインドされ、エラーを受信し(または受信せず)、fieldValueタグで再表示される整数は、IntegerのデフォルトのtoStringで表示される必要があります。この動作は、getAsText実装を修正することでエディターでカスタマイズできます。

個人的には、この種のラッパーを作成して、頻繁に使用されるタイプの全体ではなく、そのタイプ専用のエディターをセットアップできるようにします。私はこれがDBに永続化するときに少しのマッピングを意味することを理解していますが...

于 2012-08-30T13:06:19.213 に答える
1

変化する

var x = <g:formatNumber number="${fieldValue(bean: personInstance, field: 'minPrice')}" format="#" />;

var x = <g:formatNumber number="${personInstance.minPrice}" format="#" />;
于 2011-03-11T05:34:18.060 に答える
0

解決策/回避策があります...答えは「何もしない」のようです。

文字列化された数値を解析して整数に戻そうとする代わりに、選択のためにフォーマットされた文字列のままにしました。fromこれは、次のように値を変更する必要があることを意味しました。

<g:select name="minPrice" 
value="${fieldValue(bean: personInstance, field: 'minPrice')}"  
onchange="setDirty()"
noSelection='${['0':'Select a number...']}'
from="${[
    ['name':'100,000', 'id':'100,000'],
    ['name':'200,000', 'id':'200,000'],
    ['name':'300,000', 'id':'300,000']
    ]}"
optionKey="id" optionValue="name"
/>

もちろん、サーバーにポストバックすると、送信される値はエスケープされた文字列として「100,000」になります。私が気付いたのは、Grails、Spring、Hibernate、またはスタック内の何かが、永続化の前に String を正しい整数型に強制変換するということでした。

これは私の目的には問題なく機能しますが、ロケールの問題のため、基本的には解決策ではなく回避策だと思います。桁区切り記号が「.」の場合 私の小数点記号は「、」です。これはヨーロッパの多くの場合、私のコードは機能しません。

于 2010-01-22T10:20:26.270 に答える