ドメインオブジェクトに整数として定義するフィールドがあります...
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="#" />;
与える100
。fieldValue
ギブバックを覚えておいてください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コントロールで整数値を事前に選択できないという私の特定の問題は解消されていません。現時点では少し途方に暮れています。
誰か他にアイデアはありますか?