12

私はこれがかなり簡単なものだと思っていますが、グーグルではたくさんのことをしてしまいました。MVC 3では、フォーマットされた文字列をレンダリングするために@ Html.DisplayForを取得できません。

MVC 3のショッピングカートサイトで、コードファーストのEntity Frameworkを使用しています。私はオーバー送信していたモデルは、Productオブジェクトのリストであり、そしてそれらのオブジェクトのそれぞれは、このプロパティが含まれています

[Required(ErrorMessage = "This is a required field.")] 
[DataType(DataType.Currency)] 
[Range(1.00, 500.00, ErrorMessage = "Products can not be free.")] 
[DisplayFormat(DataFormatString = "{0:C}")] 
[DisplayName("Price")] 
public double Price { get; set; } 

私はdisplayFormatに属性として値をフォーマットするビューに以下の行を引き起こすだろうと期待していました通貨(商品はループ内の商品オブジェクトです):

@Html.DisplayFor(modelItem => item.Price) 

しかし、これはフォーマットには全く適用されません。これまでのところ、私は仕事にそれを得ることができました唯一の方法ではなく、これを使用することです:

@String.Format("{0:C}", item.Price) 

しかし、それが可能だ場合、ヌルのようなものを扱うように設計されていますように、私はむしろHtml.DisplayFor @使用したいです。私はそれが0以上になることを知っています。実際の検証では、常にいくらかの金額になるでしょう - しかし、私が続行する前にこれを行う正しい方法がないことを確認したいと思います。

これに関するすべての情報をお待ちしております。

UPDATE

ダーリンは答え、それは私が私が実際にビューにオーバー送信されたものの上に戻って発生する作業を、ないことを指摘しました。私はDisplayFormat属性を持つProductModelというクラスがありますが、実際には製品のリストを含む別のモデルを返していたことに気付きました。これはProductListModelと呼ばれ、ProductModelクラスではなくProductデータクラスのリストが返されたことに気付きました。

最終的には実際は非常に簡単でした。ちょうど私が半日もそれを浪費していなかったらいいのに。ダーリンに戻って正しくチェックするように感謝してくれてありがとう!

答えて

16

しかし、これはフォーマットには全く適用されません。

ああ、DisplayFormat属性が機能するはずなので、間違ったことをする必要があります。たとえば、次のように

モデル:

public class MyViewModel 
{ 
    [Required(ErrorMessage = "This is a required field.")] 
    [DataType(DataType.Currency)] 
    [Range(1.00, 500.00, ErrorMessage = "Products can not be free.")] 
    [DisplayFormat(DataFormatString = "{0:C}")] 
    [DisplayName("Price")] 
    public double Price { get; set; } 
} 

コントローラー:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new MyViewModel 
     { 
      Price = 0.56 
     }; 
     return View(model); 
    } 
} 

ビュー(~/Views/Home/Index.cshtml):

@model MyViewModel 
@Html.DisplayFor(x => x.Price) 

私は、このアプリケーションを実行すると、私は完全に予想通り、取得、$0.56

だから何ですか?あなたのシナリオは私のものとどう違うのですか?

+1

あなたは正しいです。それは一日遅く、実際に私が別のものを表示していたときに私が1つのことを表示していたと考えることの愚かな間違いをしていました!私は私のポストを更新します。それが動作することを証明してくれてありがとう! –

+3

'[DataType(DataType.Currency)]'だけで十分です。 DisplayFormatは必要ありません –

0

Currency.cshtmlDisplayTemplateを作成し、DisplayFormat属性を削除することもできます。それであなたのCurrency.cshtmlではあなたは好きなようにフォーマットします。

テンプレート処理の一部として、DataTypeを使用してテンプレートを選択します。

しかし、ダーリンの言うとおり、これはこれをしないとうまくいくはずです。あなたの書式設定が適用されないDisplayTemplatesCurrency.cshtmlというファイルが既にありますか?

関連する問題