2

MVC アプリケーションのカミソリ ビューで、null 許容の 10 進数フィールドを通貨 (ドル記号とカンマを使用) としてフォーマットする方法を教えてください。以下は私のモーダルとビューのコードです。

モデル:

[Display(Name = "Eligible Amount")]
[RequiredIfProjectEngineerSelected("ProjectEngineerId", "", ErrorMessage = "Eligible Amount field is Required")]        
[DisplayFormat(DataFormatString = "{0:c}")]        
public decimal? EligibleAmount { get; set; }

ビュー:

@{var formated = String.Format("{0:c}",  decimal)decimal.Parse(@Model.project.ProjectTotalCost.HasValue ? @Model.project.ProjectTotalCost.Value.ToString() : ""));}
@Html.TextBoxFor(model => model.project.ProjectTotalCost, new { @Value = formatted})

TextBoxFor コントロールに書式設定された通貨値を表示しています。しかし、ここで直面している問題は、値を更新しようとすると、「値がフォーマットと一致しません」という検証エラーが発生することです。

4

2 に答える 2

5

まず最初に、ビューに表示されている 2 行のコードを 1 行のコードに置き換える必要があります。

@Html.EditorFor(x => x.EligibleAmount)

モデルで定義した属性が考慮DisplayFormatされ、ビューでこの形式を繰り返す必要はありません。ApplyFormatInEditModeプロパティをtrue次のように設定して、編集モードで有効にするだけです。

[Display(Name = "Eligible Amount")]
[RequiredIfProjectEngineerSelected("ProjectEngineerId", "", ErrorMessage = "Eligible Amount field is Required")]        
[DisplayFormat(DataFormatString = "{0:c}", ApplyFormatInEditMode = true)]        
public decimal? EligibleAmount { get; set; }

よし、これで表示部分は解決。しかし、モデル バインディングの部分はまだ問題です。そのために、属性で定義されたフォーマットを考慮に入れるカスタム モデル バインダーを作成できDisplayFormatます。このようなモデル バインダーの例として、DateTime at を示しましたthis post。あなたがしなければならないdecimalのは、それを時間に適応させることだけです。これは些細な作業です。

于 2013-03-05T22:07:47.023 に答える