8

tôi thấy bài này về hiển thị và EditorTemplates cho MVC:Formatting tệ sử dụng mẫu trưng bày trong MVC

http://www.growingwiththeweb.com/2012/12/aspnet-mvc-display-and-editor-templates.html

Nó tạo ra một mẫu màn hình để dễ dàng hiển thị một số thập phân được định dạng với dấu hiệu tiền tệ.

Mô hình sử dụng trong ví dụ:

public class TestModel 
{ 
    public decimal Money { get; set; } 
} 

Màn hình hiển thị mẫu:

Views/Shared/DisplayTemplates/decimal.cshtml:

@model decimal 

@{ 
    IFormatProvider formatProvider = 
     new System.Globalization.CultureInfo("en-US"); 
    <span class="currency">@Model.ToString("C", formatProvider)</span> 
} 

Trong trang web của tôi Tôi có một helper lớp học với một phương pháp để lấy một chuỗi tiền tệ được định dạng từ một số thập phân, vì vậy tôi sẽ thay thế ở trên bằng một cái gì đó như:

@model decimal 
@(MyHelperClass.GetCurrencyString(Model)) 

Và cuối cùng là xem nơi chúng tôi muốn nhìn thấy đồng tiền được định dạng:

@model TestModel  
@Html.DisplayFor(e => e.Money) 

Output:

<span class="currency">$3.50</span> 

tôi có thể thực hiện điều này mà không cần bất kỳ vấn đề. Nhưng tất nhiên tôi có quan điểm khác nhau, nơi tôi muốn xem một loại tiền tệ được định dạng. Nhưng trong một số trường hợp, tôi không muốn hiển thị ký hiệu tiền tệ.

Câu hỏi của tôi bây giờ là cách tôi nên triển khai biến thể nhỏ này mà không cần quá nhiều mã.

Đây là thực hiện hiện tại của tôi:

Tôi đã thay đổi mẫu hiển thị của tôi như thế này:

@model decimal 

@{ 
    bool woCurrency = (bool)ViewData["woCurrency"]; 
} 

@(MyHelperClass.GetCurrencyString(Model)Model,woCurrency)) 

Dĩ nhiên tôi cũng đã thay đổi phương pháp GetCurrencyString chấp nhận thuộc tính bổ sung này.

Theo quan điểm của tôi bây giờ tôi phải cung cấp thuộc tính này quá:

@Html.DisplayFor(m => m.Money, new { woCurrency = true }) 

Vì vậy, thực sự tôi mọi thứ hoạt động như nó nên làm việc. Nhưng bằng cách nào đó tôi không thích sự sollution này khiến cho cái nhìn phức tạp hơn.

Câu hỏi của tôi với bạn: Có phương pháp nào khác để triển khai một cái gì đó như thế này không? Hoặc bất kỳ lời khuyên nào để có thể tối ưu hóa sự sollution hiện tại của tôi?

Cảm ơn!

Trả lời

2

Làm thế nào về HtmlHelper tự động kiểm tra ViewData["woCurrency"] và xuất kết quả chính xác?

public static string Currency(this HtmlHelper helper, decimal data, string locale = "en-US", bool woCurrency = false) 
    { 
     var culture = new System.Globalization.CultureInfo(locale); 

     if (woCurrency || (helper.ViewData["woCurrency"] != null && (bool)helper.ViewData["woCurrency"])) 
      return data.ToString(culture); 

     return data.ToString("C", culture); 
    } 

Sau đó:

@Html.Currency(Model.Money); 
+0

Cảm ơn bạn đã đề xuất. Điều này có nghĩa là tôi luôn luôn cần đặt thuộc tính trong chế độ xem trong chế độ xem không? Vì tôi có nhiều giá tôi muốn hiển thị trong một chế độ xem nhưng không phải tất cả giá đều hiển thị ký hiệu tiền tệ. Khi tôi bắt đầu đọc về các mẫu hiển thị, tôi nghĩ rằng chúng sẽ làm cho mọi thứ trở nên dễ dàng hơn và sạch hơn, nhưng có vẻ như chúng đã lừa tôi: ( – ThdK

+0

Bạn cũng có thể đặt 'ViewData' trong' bộ điều khiển' là – haim770

+0

Vâng, tôi biết rồi sẽ có cùng giá trị cho mỗi loại tiền tệ tôi muốn định dạng trên chế độ xem hiện tại.Tôi có một mô hình chế độ xem biểu thị một dòng trong giỏ. Một trong các thuộc tính là giá thập phân. Đối với hầu hết các dòng tôi không muốn ký hiệu tiền tệ, tổng số và tổng số dòng, tôi muốn hiển thị các ký hiệu tiền tệ.Tuy nhiên, cả hai dòng sử dụng cùng một đối tượng (viewmodel) để lưu trữ các giá trị của họ – ThdK

17

Bạn cần áp dụng thuộc tính DisplayFormat cho thuộc tính Money của mình.Ví dụ:

[DisplayFormat(DataFormatString = "{0:C}")] 
public decimal Money { get; set; } 

Để biết thêm thông tin có một cái nhìn tại hai liên kết sau đây:

  1. DisplayFormatAttribute.DataFormatString (Ví dụ ở dưới cùng của trang sử dụng tiền tệ định dạng như một ví dụ)
  2. ASP.NET MVC - DisplayFormat attribute
+0

Thật không may, chúng tôi có một số quy tắc tùy chỉnh để định dạng chuỗi tiền tệ ... Điều này cũng sẽ ảnh hưởng đến việc vẽ của loại tiền tệ trên mỗi nơi nó được sử dụng trong khi tôi chỉ muốn thực hiện hai cách triển khai khác nhau. – ThdK

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