12

Tôi hy vọng điều này khá đơn giản, mặc dù sau rất nhiều Googling, tôi đã không thể làm việc được.Trong MVC 3, tôi không thể nhận được @ Html.DisplayFor để hiển thị một chuỗi được định dạng

Tôi đang làm việc trên trang web giỏ hàng với MVC 3 và sử dụng Khuôn khổ thực thể mã đầu tiên. Mô hình tôi gửi qua là danh sách các đối tượng Product, và mỗi người trong số các đối tượng bao gồm khách sạn này:

[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; } 

Tôi đã hy vọng rằng thuộc tính DisplayFormat sẽ gây ra dòng sau trong giao diện để định dạng giá trị như một loại tiền tệ (mục là đối tượng sản phẩm trong vòng lặp):

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

Nhưng điều này không áp dụng định dạng nào cả. Cho đến nay, cách duy nhất tôi có thể làm cho nó hoạt động là sử dụng thay thế này:

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

Nhưng nếu có thể, tôi muốn sử dụng @ Html.DisplayFor vì nó được thiết kế để xử lý những thứ như null . Tôi biết nó sẽ là 0 hoặc nhiều hơn. Trong thực tế với việc xác nhận nó sẽ luôn luôn là một số tiền - nhưng tôi muốn chắc chắn rằng không có một cách chính xác hơn để làm điều này trước khi tôi tiếp tục.

Mọi thông tin về điều này sẽ được đánh giá cao nhất!

CẬP NHẬT

Darin đã trả lời và chỉ ra rằng nó không làm việc, khiến tôi đi trở lại hơn những gì tôi đã thực sự gửi sang chế độ xem. Tôi nhận ra rằng mặc dù tôi có một lớp gọi là ProductModel, trong đó có thuộc tính DisplayFormat, tôi đã thực sự trả về một mô hình khác có chứa một danh sách các sản phẩm. Điều này được gọi là ProductListModel và tôi nhận ra rằng nó trả về một danh sách các lớp dữ liệu sản phẩm - không phải lớp ProductModel!

Vì vậy, cuối cùng nó thực sự rất đơn giản. Chỉ ước gì tôi đã không lãng phí nửa đêm vào nó. Cảm ơn vì đã truyền cảm hứng cho tôi để quay lại và kiểm tra đúng, Darin!

Trả lời

16

Nhưng điều này hoàn toàn không áp dụng định dạng.

Ồ, bạn phải làm điều gì đó rất sai vì thuộc tính DisplayFormat sẽ hoạt động.Ví dụ:

mẫu:

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; } 
} 

Bộ điều khiển:

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

View (~/Views/Home/Index.cshtml):

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

Khi tôi chạy ứng dụng này tôi nhận được, như hoàn toàn mong đợi, $0.56 .

Vì vậy, điều gì mang lại? Kịch bản của bạn khác với tôi như thế nào?

+1

Bạn nói đúng Darin. Đó là vào cuối ngày và tôi đã mắc sai lầm ngu ngốc khi nghĩ rằng tôi đang hiển thị một điều khi thực sự tôi đang trưng bày một thứ khác! Tôi sẽ cập nhật bài đăng của mình. Cảm ơn bạn đã chứng minh rằng nó hoạt động! –

+3

chỉ '[DataType (DataType.Currency)]' là đủ. bạn thậm chí không cần DisplayFormat –

0

Một tùy chọn là tạo một Currency.cshtmlDisplayTemplate và xóa thuộc tính DisplayFormat. Sau đó, trong Currency.cshtml, bạn sẽ định dạng nó theo cách bạn muốn.

Là một phần của quá trình tạo mẫu, DataType được sử dụng để chọn mẫu.

Tuy nhiên, như Darin nói, điều này sẽ hoạt động mà không làm điều này. Bạn có, đã từng có một tệp Currency.cshtml trong số DisplayTemplates của mình không áp dụng định dạng không?