@ Html.DisplayFor - DateFormat (“mm / dd / yyyy”)


88

Tôi có mã dao cạo sau đây mà tôi muốn có mm/dd/yyyyđịnh dạng ngày tháng:

Audit Date: @Html.DisplayFor(Model => Model.AuditDate)

Tôi đã thử nhiều cách tiếp cận khác nhau nhưng không có cách nào trong số đó hiệu quả trong tình huống của tôi

AuditDate của tôi là một DateTime?loại

Tôi đã thử một cái gì đó như thế này và gặp lỗi này:

@Html.DisplayFor(Model => Model.AuditDate.Value.ToShortDateString())

Thông tin bổ sung: Chỉ có thể sử dụng các mẫu với quyền truy cập trường, quyền truy cập thuộc tính, chỉ mục mảng một thứ nguyên hoặc biểu thức trình lập chỉ mục tùy chỉnh một tham số.

Đã thử cái này:

@Html.DisplayFor(Model => Model.AuditDate.ToString("mm/dd/yyyy"))

Không có quá tải cho phương thức 'ToString' nhận 1 đối số

Câu trả lời:


161

Nếu bạn sử dụng DisplayFor, thì bạn phải xác định định dạng thông qua DisplayFormatthuộc tính hoặc sử dụng mẫu hiển thị tùy chỉnh. (Bạn DisplayFormatStringcó thể tìm thấy danh sách đầy đủ các cài đặt sẵn tại đây .)

[DisplayFormat(DataFormatString = "{0:d}")]
public DateTime? AuditDate { get; set; }

Hoặc tạo chế độ xem Views\Shared\DisplayTemplates\DateTime.cshtml:

@model DateTime?
@if (Model.HasValue)
{
    @Model.Value.ToString("MM/dd/yyyy")
}

Tuy nhiên, điều đó sẽ áp dụng cho tất cả các DateTimes, ngay cả những người mà bạn cũng đang mã hóa thời gian. Nếu bạn muốn nó chỉ áp dụng cho các thuộc tính chỉ ngày, thì hãy sử dụng Views\Shared\DisplayTemplates\Date.cshtmlDataTypethuộc tính trên thuộc tính của bạn:

[DataType(DataType.Date)]
public DateTime? AuditDate { get; set; }

Tùy chọn cuối cùng là không sử dụng DisplayForvà thay vào đó hiển thị thuộc tính trực tiếp:

@if (Model.AuditDate.HasValue)
{
    @Model.AuditDate.Value.ToString("MM/dd/yyyy")
}

Tôi đã tạo ra một displayTemplate như bạn đề nghị và khi tôi copy và dán đoạn mã mà bạn có trong mẫu sau đó tôi nhận được lỗi nàyNo overload for method 'ToString' takes 1 arguments
Nick Kahn

3
Tôi nghĩ rằng nên[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")]

[DisplayFormat (DataFormatString = "{0: dd / MM / yyyy}")] đã làm việc cho Thổ Nhĩ Kỳ, cảm ơn
zapoo

@Mac: Ý bạn là thế nào? Họ rất nhiều làm việc, nhưng có lẽ chỉ không trong tình huống cụ thể của bạn. Nếu không có thêm thông tin, tôi không thể nói tình huống của bạn là gì.
Chris Pratt

Nếu bạn muốn soạn thảo để sử dụng định dạng này là tốt, thêm ApplyFormatInEditMode = truevào bất động sản: [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]. Đó là điều hiển nhiên, nhưng khi bạn không-có-thời-gian-để-lãng-phí-sao-chép-dán, gợi ý từ intellisense có thể đi qua mũi bạn như nó đã xảy ra với tôi :)
Heki

19

Nếu bạn chỉ đơn giản xuất ra giá trị của thuộc tính mô hình đó, bạn không cần trình DisplayFortrợ giúp html, chỉ cần gọi nó trực tiếp với định dạng chuỗi phù hợp .

Audit Date: @Model.AuditDate.Value.ToString("d")

Nên xuất

Audit Date: 1/21/2015

Cuối cùng, ngày kiểm tra của bạn có thể là giá trị rỗng, vì vậy bạn nên thực hiện kiểm tra có điều kiện trước khi cố gắng định dạng giá trị có thể vô hiệu.

@if (item.AuditDate!= null) { @Model.AuditDate.Value.ToString("d")}

Googling lỗi mà bạn gặp phải cung cấp câu trả lời này , cho thấy rằng lỗi là do sử dụng từ Model trong trình trợ giúp Html của bạn. Ví dụ, sử dụng @Html.DisplayFor(Model=>Model.someProperty). ModelVí dụ: hãy @Html.DisplayFor(x=>x.someProperty)thay đổi những điều này để sử dụng thứ gì đó khác ngoài : hoặc thay đổi Mviết hoa thành chữ thường mtrong những trợ giúp này.


nếu tôi sử dụng @Model.AuditDate.Value.ToString("d") Additional information: Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.
Nick Kahn

@AbuHamzah - có vẻ như bạn vẫn đang cố gắng đưa cái này vào trình Html.DisplayFortrợ giúp. Đừng làm vậy. Ngoài ra, bạn có chắc chắn rằng nó gây ra lỗi trên dòng đó chứ không phải một số thuộc tính khác mà bạn đang cố gắng sử dụng trình DisplayFortrợ giúp?
Tommy

Nếu tôi sử dụng, @Model...tôi gặp lỗi này: 'Model' xung đột với khai báo System.Web.Mvc.WebViewPage <TModel> .Model '
Nick Kahn

@AbuHamzah Vui lòng xem đoạn cuối trong câu trả lời cập nhật của tôi.
Tommy

11

Tôi đã sử dụng thay đổi này trong mã của mình:

mã cũ:

 <td>
  @Html.DisplayFor(modelItem => item.dataakt)
 </td>

Mới :

<td>
 @Convert.ToDateTime(item.dataakt).ToString("dd/MM/yyyy")
</td>

... và? Đây là câu trả lời hay là gì?
Maciej Jureczko

Vâng, nó chỉ đơn giản là giải pháp cho vấn đề từ chủ đề. Tôi nghĩ điều này có thể hữu ích cho ai đó.
Piotr Mirek,

OK, tôi khuyên bạn nên thay đổi "Tôi đã sử dụng thay đổi này trong mã của mình" thành một điều gì đó nói rõ rằng đây là một giải pháp.
Maciej Jureczko

Câu trả lời đơn giản và thuận tiện, đã làm việc cho tôi cảm ơn !!
Máy quét


5

Tôi đã triển khai điều tương tự theo cách này:

  1. Sử dụng TextBoxFor để hiển thị ngày ở định dạng bắt buộc và làm cho trường chỉ đọc .
@Html.TextBoxFor(Model => Model.AuditDate, "{0:dd-MMM-yyyy}", new{@class="my-style", @readonly=true})

2. Cung cấp đường viền bằng khôngđường viền bằng không cho TextBox trong css.

.my-style {
    outline: none;
    border: none;
}

Và ...... Nó đã xong :)


1
Nhưng tại sao bạn lại làm như vậy?
CodeCaster

Bởi vì bất kỳ phương pháp nào khác không hiệu quả với tôi và nó giúp tôi tiết kiệm rất nhiều mã hóa. Ngoài ra, kết quả cuối cùng là chỉ đọc và không có đường viền, vì vậy nó không giống như một hộp văn bản.
Akshat

4

Đối với tôi, nó là đủ để sử dụng

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
public DateTime StartDate { set; get; }

4

Bạn có thể sử dụng thuộc tính [ DisplayFormat ] trên mô hình chế độ xem của mình khi bạn muốn áp dụng định dạng này cho toàn bộ dự án.

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
public Nullable<System.DateTime> Date { get; set; }

2

Sau khi một số digging và tôi đã kết thúc việc thiết Thread's CurrentCulture giá trị để có CultureInfo ( 'en-US') trong phương pháp hành động của bộ điều khiển:

Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); 

Dưới đây là một số tùy chọn khác nếu bạn muốn có cài đặt này trên mọi chế độ xem.

Về CurrentCulturegiá trị tài sản:

Các CultureInfo đối tượng được trả về bởi thuộc tính này, cùng với các đối tượng liên quan, xác định dạng mặc định cho những ngày, thời gian, số lượng, giá trị tiền tệ, thứ tự sắp xếp của văn bản, công ước vỏ, và so sánh chuỗi.

Nguồn: MSDN CurrentCulture

Lưu ý:CurrentCulture Cài đặt thuộc tính trước đó có thể là tùy chọn nếu bộ điều khiển đã chạy với CultureInfo("en-US")hoặc tương tự với định dạng ngày"MM/dd/yyyy" .

Sau khi đặt thuộc CurrentCulturetính, hãy thêm khối mã để chuyển ngày sang "M/d/yyyy"định dạng trong dạng xem:

@{  //code block 
    var shortDateLocalFormat = "";
    if (Model.AuditDate.HasValue) {
       shortDateLocalFormat = ((DateTime)Model.AuditDate).ToString("M/d/yyyy");
       //alternative way below
       //shortDateLocalFormat = ((DateTime)Model.AuditDate).ToString("d");
    }
}

@shortDateLocalFormat

Bên trên @shortDateLocalFormatbiến được định dạng với ToString("M/d/yyyy")các tác phẩm. Nếu ToString("MM/dd/yyyy")được sử dụng, giống như tôi đã làm đầu tiên thì bạn sẽ gặp phải vấn đề số 0 hàng đầu . Cũng giống như đề xuất của Tommy cũng ToString("d") hoạt động. Trên thực tế "d"là viết tắt của "Mẫu ngày ngắn" và có thể được sử dụng với các định dạng văn hóa / ngôn ngữ khác nhau.

Tôi đoán khối mã từ trên cũng có thể được thay thế bằng một số phương pháp trợ giúp thú vị hoặc tương tự.

Ví dụ

@helper DateFormatter(object date)
{
    var shortDateLocalFormat = "";
    if (date != null) {     
        shortDateLocalFormat = ((DateTime)date).ToString("M/d/yyyy");
     }

    @shortDateLocalFormat
}

có thể được sử dụng với cuộc gọi trợ giúp này

@DateFormatter(Model.AuditDate)

Cập nhật , tôi phát hiện ra rằng có một cách thay thế để làm điều tương tự khi phương thức DateTime.ToString (String, IFormatProvider) được sử dụng. Khi phương pháp này được sử dụng sau đó không cần phải sử dụng Thread's CurrentCulturetài sản. Giá trị CultureInfo("en-US")được truyền dưới dạng đối số thứ hai -> IFormatProvider cho DateTime.ToString(String, IFormatProvider)phương thức.

Phương thức trợ giúp đã sửa đổi:

@helper DateFormatter(object date)
{
    var shortDateLocalFormat = "";
    if (date != null) {
       shortDateLocalFormat = ((DateTime)date).ToString("d", new System.Globalization.CultureInfo("en-US"));
    }

    @shortDateLocalFormat
}

.NET Fiddle


1

Có thể thử đơn giản

@(Model.AuditDate.HasValue ? Model.AuditDate.ToString("mm/dd/yyyy") : String.Empty)

Ngoài ra, bạn có thể sử dụng nhiều loại định dạng chuỗi như .ToString ("dd MMM, yyyy") .ToString ("d"), v.v.


nhận được lỗi: xung đột 'Mẫu' với tuyên bố 'System.Web.Mvc.WebViewPage <TModel> .Model'
Nick Kahn

nếu tôi sử dụng @modelnó không nhận ra
Nick Kahn

@AbuHamzah - Tôi đã nhầm, nó viết hoa Mkhi sử dụng trong trang HTML, viết thường mkhi khai báo.
Tommy

vẫn gặp lỗi, vui lòng xem Tôi trả lời câu trả lời của Tommy
Nick Kahn

1
No overload for method 'ToString' takes 1 argumentsphàn nàn khi tôi sử dụngToString("mm/dd/yyyy")
Nick Kahn

1

Trong Xem Thay thế cái này:

@Html.DisplayFor(Model => Model.AuditDate.Value.ToShortDateString())

Với:

@if(@Model.AuditDate.Value != null){@Model.AuditDate.Value.ToString("dd/MM/yyyy")}
else {@Html.DisplayFor(Model => Model.AuditDate)}

Giải thích: Nếu giá trị AuditDate không phải là null thì nó sẽ định dạng ngày thành dd / MM / yyyy, nếu không thì để nguyên như vậy vì nó không có giá trị.


0

Tôi đã gặp sự cố tương tự trên bộ điều khiển của mình và đây là những gì phù hợp với tôi:

model.DateSigned.HasValue ? model.DateSigned.Value.ToString("MM/dd/yyyy") : ""

"DateSigned" là giá trị từ mô hình của tôi Dòng đọc, nếu giá trị mô hình có giá trị thì hãy định dạng giá trị, nếu không thì không hiển thị gì.

Hy vọng điều đó sẽ giúp


0

Đây là cách tốt nhất để có một chuỗi ngày đơn giản:

 @DateTime.Parse(Html.DisplayFor(Model => Model.AuditDate).ToString()).ToShortDateString()

Đây là những gì câu trả lời này làm: lấy HtmlStringđầu ra bằng DisplayFor, chuyển đổi nó thành a String, phân tích cú pháp nó dưới dạng a DateTime, sau đó định dạng thành a String. Theo tôi, không cần thiết phải phức tạp.
Heretic Monkey

0

Bạn có thể sử dụng Convert

 <td>@Convert.ToString(string.Format("{0:dd/MM/yyyy}", o.frm_dt))</td> 

-1

Xem câu trả lời này vềNo overload for method 'ToString' takes 1 arguments lỗi.

Bạn không thể định dạng DateTime nullable - bạn phải sử dụng thuộc tính DateTime.Value.

@Model.AuditDate.HasValue ? Model.AuditDate.Value.ToString("mm/dd/yyyy") : string.Empty

Mẹo: Sẽ luôn hữu ích nếu bạn làm việc này trong một lớp tiêu chuẩn với intellisense trước khi đưa nó vào chế độ xem. Trong trường hợp này, bạn sẽ gặp lỗi biên dịch rất dễ phát hiện trong một lớp.


nếu tôi sử dụng mã được đề xuất thì gặp lỗi này'Model' conflicts with the declaration 'System.Web.Mvc.WebViewPage<TModel>.Model'
Nick Kahn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.