9

asp.net 4.5 より前の昔は、日付を Gridview、Formview、またはその他のデータ バインドされたコントロールに簡単にバインドし、単純な書式文字列で見栄えを良くすることができました。

            <asp:TextBox 
                ID="DateFieldTextBox" 
                runat="server" 
                Text='<%# Bind("DateField","{0:d}") %>'/>

強く型付けされた新しいモデル バインディングは、少し難しくなります。

            <asp:TextBox 
                ID="DateFieldTextBox" 
                runat="server" 
                Text='<%# BindItem.DateField %>'/>

動作しますが、日付だけでなく完全な日付/時刻文字列を生成します。

            <asp:TextBox 
                ID="DateFieldTextBox" 
                runat="server" 
                Text='<%# BindItem.DateField.ToShortDateString() %>'/>

.. これは機能するはずですが、コンパイル時に「BindItem のコード構文が無効です」というエラーが発生します。Item.DateField.ToShortDateString() は機能しますが、ポストバックにバインドしません。

今のところ、古い構文に戻しましたが、最新のコンパイル時間チェックを取得したいと考えていますが、それでも日付を適切にフォーマットできます。他の誰かが以前にこれに遭遇しましたか?

4

4 に答える 4

2

私はかなり長い間これに苦労しました。私の解決策は、FormView での DynamicControl の使用とともに、データ モデルでデータ注釈を組み合わせることでした。これは WebForms プロジェクトと MCV プロジェクトであると想定しています。

WebFormsでのデータ アクセスの領域について少し読んでください。これは、WebForms データ アクセス/プレゼンテーション コントロールに関する MS の優れた記事の 1 つであり、DynamicControl への参照が含まれています。

//I know you want this, and I did too.  It seems like it could/should work, but it doesn't        
<asp:TextBox 
     ID="DateFieldTextBox" 
     runat="server" 
     Text='<%# BindItem.DateField.ToShortDateString() %>'/>

//This works, but you also need to use the Data Annotations in your model.
<asp:DynamicControl
     ID="DateFieldTextBox"
     runat="server"
     DataField="DateField"
     Mode="Edit" />

//sample model annotations in your object class
  [Column(TypeName = "date"), DataType(DataType.Date), DisplayFormat(DataFormatString = "  {0:MM/dd/yyyy}", ApplyFormatInEditMode = true )]
  public DateTime DateField { get; set; }

このパターンを使用するのは、日付を正しい形式 (および通貨など) で表示できる双方向モデル バインディングが必要だからです。TextBox コントロールがこのようなモデル データの書式設定を完全に処理しないことは本当に残念です。このコンテキストでは、DataAnnotations は無視されます。双方向バインディングは、フォーマットがない場合は機能しますが、フォーマットが必要な場合は機能しません。不完全な WebForms 実装の IMO のようです。

一方、DynamicControl の使用は機能しますが、コーディング中にモデルのメンバーを提供する DataField プロパティで Intellisense を取得できません。何????もう 1 つの不完全な、あまり好ましくない解決策があります。

于 2014-11-04T20:16:28.613 に答える
2

グリッド ビューでデータを表示するには、Item.DateField.ToShortString() を実行すると、一方向のデータ バインディングとして機能します。つまり、すでに記録にあるものを表示しています。BindItem.DateField.ToDateString() は、オブジェクトを DateTime から文字列に変換しますが、既に表示されているようにエラーが発生します。フィールドを編集している間、または新しいエントリを受け入れるために、フォームビューで Bind(expression,format) を使用し続けることができます。

于 2012-10-09T18:47:18.977 に答える
1

2日間苦労した後、フォーマットされたフィールド値に対するこの双方向モデルバインディングの問題の解決策をついに見つけました。TextBox のプロパティ テキストの後にある一重引用符または二重引用符 "" または '' を削除するだけです。それは私にとって魅力のように機能します!! ただし、TextBox の TextMode プロパティを Date に使用している場合は、削除してください。原因は、サーバーまたは DB からの値が表示されないことです。日付ピッカーまたはカレンダーを使用する場合は、AJAX CalendarExtender コントロールを追加して、カレンダーから日付を選択するだけです。

<asp:TextBox ID="DateFieldTextBox" runat="server" Text=<%# Bind("DateField","{0:d}") %>/>
于 2015-06-08T13:40:40.603 に答える