12

我希望這是一個相當簡單的,雖然大量谷歌搜索後,我一直無法解決它。在MVC 3中,我無法獲得@ Html.DisplayFor來呈現格式化的字符串

我正在使用MVC 3的購物車網站,並使用代碼優先的實體框架。我送過該模型是產品對象的列表,每個這些對象包括該物業:

[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

達林回答,並指出它的工作,這引起了我回去了我在實際發送到該視圖。我意識到,儘管我有一個名爲ProductModel的類,它具有DisplayFormat屬性,但我實際上正在返回包含產品列表的另一個模型。這叫做ProductListModel,我意識到它返回了產品數據類的列表 - 而不是ProductModel類!

所以最後它實際上很簡單。只是希望我沒有浪費半天的時間。謝謝你鼓勵我回去檢查,Darin!

回答

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

你是對的達林。現在已經很晚了,我正在犯一個愚蠢的錯誤,認爲我在展示另一件事物時顯示了一件事情!我會更新我的帖子。感謝您證明它確實可行! –

+3

只是'[DataType(DataType.Currency)]'就足夠了。你甚至不需要DisplayFormat –

0

一個選項是創建一個Currency.cshtmlDisplayTemplate並刪除DisplayFormat屬性。然後在你的Currency.cshtml中,你可以將它格式化,只要你喜歡。

作爲模板過程的一部分,DataType用於選擇模板。

但是,正如Darin所說,這應該不會這樣做。你是否已經在你的DisplayTemplates中有Currency.cshtml文件不適用格式?