2014-04-02 26 views
7

Tôi tự hỏi sự khác biệt là gì giữa ValueFor, mà tôi không biết cho đến gần đây và DisplayFor, mà tôi đã sử dụng để hiển thị các giá trị.Sự khác biệt giữa DisplayFor và ValueFor

tôi thiết lập một dự án thử nghiệm, trong đó tôi tạo ra một mô hình với 2 thuộc tính:

public class TestModel 
{ 
    [Display(Name = "Montant")] 
    [DisplayFormat(DataFormatString = "{0:C2}")] 
    public Decimal Amount 
    { 
     get; 
     set; 
    } 

    [Display(Name = "Date d'achat")] 
    [DataType(DataType.Date)] 
    public DateTime Date 
    { 
     get; 
     set; 
    } 
} 

Dưới đây là kết quả tôi nhận được:

TestModel model = new TestModel 
{ 
    Amount = 1234.333M, 
    Date = DateTime.Today.AddDays(-10) 
}; 

@Html.DisplayFor(x => x.Amout) => "1 234,33 €" 
@Html.ValueFor(x => x.Amount) => "1234,333" 

@Html.DisplayFor(x => x.Date) => "23/03/2014" 
@Html.ValueFor(x => x.Date)  => "23/03/2014 00:00:00" 

Từ những gì tôi nhìn thấy, không có lợi thế sử dụng ValueFor thay vì @Model.PropertyName

Khi tìm kiếm câu trả lời, tôi tình cờ gặp this question câu trả lời được trả lời nhiều nhất, wh ile không bình chọn câu trả lời hay nhất, cho kết quả khác với tôi.

Bất kỳ ai cũng biết lý do chúng tôi nhận được kết quả khác nhau và việc sử dụng thực sự sử dụng số ValueFor là gì?

Trả lời

3

Trước tiên tôi đã nghe nói về ValueFor cũng .... Tuy nhiên, nhìn vào source có thể thấy rằng ValueFor không đơn giản làm cho chỉ sử dụng các siêu dữ liệu so với mô hình bỏ qua bất kỳ mẫu kèm theo (built-in hoặc tập quán).


đào sâu hơn cho thấy rằng trong thực tế, kết quả của ValueFor là tương đương với gọi String.Format hoặc Convert.ToString sử dụng văn hóa hiện nay tùy thuộc vào việc bạn cung cấp một định dạng tùy chỉnh

@Html.ValueFor(x => x.Amount) = Convert.ToString(x.Amount, CultureInfo.CurrentCulture) 
@Html.ValueFor(x => x.Amount, "0.00") = String.Format(x.Amount, "0.00", CultureInfo.CurrentCulture) 
+1

Làm thế nào bạn có thể giải thích rằng siêu dữ liệu ('DataType' và' DisplayFormat') không được sử dụng ** ở tất cả ** khi tôi sử dụng 'ValueFor' sau đó? –

+0

@mickaeld mặc dù nguồn cho biết nó * nên * đang sử dụng siêu dữ liệu - thực tế là nó không có. Nếu bạn đi theo đường dẫn nguồn, nó gọi 'HtmlHelper.FormatValue' mà nội bộ gọi là' ViewDataDictionary.FormatValueInternal' mà lần lượt chỉ gọi 'Convert.ToString' hoặc' String.Format' tùy thuộc vào việc bạn có cung cấp tham số định dạng tùy chỉnh hay không. Tôi đã sửa đổi câu trả lời của mình – James

+0

@mickaeld: Bạn chỉ nên sử dụng ValueFor nếu bạn đang xây dựng các tiện ích trợ giúp HTML của riêng mình. –

Các vấn đề liên quan