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


90

ฉันมีรหัสมีดโกนต่อไปนี้ที่ฉันต้องการมีmm/dd/yyyyรูปแบบวันที่:

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

ฉันได้ลองใช้หลายวิธี แต่ไม่มีวิธีใดที่ใช้ได้ผลกับสถานการณ์ของฉัน

AuditDate ของฉันเป็นDateTime?ประเภท

ฉันได้ลองสิ่งนี้แล้วและได้รับข้อผิดพลาดนี้:

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

ข้อมูลเพิ่มเติม: เทมเพลตสามารถใช้ได้เฉพาะกับการเข้าถึงฟิลด์การเข้าถึงคุณสมบัติดัชนีอาร์เรย์มิติเดียวหรือนิพจน์ตัวทำดัชนีที่กำหนดเองพารามิเตอร์เดียว

ลองสิ่งนี้:

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

ไม่มีการโอเวอร์โหลดสำหรับเมธอด 'ToString' รับ 1 อาร์กิวเมนต์

คำตอบ:


164

หากคุณใช้DisplayForคุณจะต้องกำหนดรูปแบบผ่านDisplayFormatแอตทริบิวต์หรือใช้เทมเพลตการแสดงผลที่กำหนดเอง (สามารถดูรายการค่าที่ตั้งล่วงหน้าทั้งหมดDisplayFormatStringได้ที่นี่ )

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

หรือสร้างมุมมองViews\Shared\DisplayTemplates\DateTime.cshtml:

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

ซึ่งจะใช้กับทุกคนDateTimeแม้ว่าคุณจะเข้ารหัสเวลาด้วยก็ตาม หากคุณต้องการให้ใช้เฉพาะกับคุณสมบัติวันที่เท่านั้นให้ใช้Views\Shared\DisplayTemplates\Date.cshtmlและDataTypeแอตทริบิวต์ในคุณสมบัติของคุณ:

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

ตัวเลือกสุดท้ายคือไม่ใช้DisplayForและแสดงผลคุณสมบัติโดยตรงแทน:

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

ฉันได้สร้าง displayTemplate ตามที่คุณแนะนำแล้วและเมื่อฉันคัดลอกและวางโค้ดที่คุณมีในเทมเพลตฉันก็ได้รับข้อผิดพลาดนี้No overload for method 'ToString' takes 1 arguments
Nick Kahn

4
คิดว่าน่าจะ[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")]

[DisplayFormat (DataFormatString = "{0: dd / MM / yyyy}")] ทำงานให้ตุรกีขอบคุณ
zapoo

@ แมค: หมายความว่าไง? พวกเขาเป็นอย่างมากทำงาน แต่บางทีอาจจะเป็นเพียงแค่ไม่ได้อยู่ในสถานการณ์เฉพาะของคุณ หากไม่มีข้อมูลเพิ่มเติมฉันไม่สามารถบอกได้ว่าสถานการณ์ของคุณเป็นอย่างไร
Chris Pratt

หากคุณต้องการแก้ไขที่จะใช้รูปแบบเช่นกันเพิ่มไปยังสถานที่:ApplyFormatInEditMode = true [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]มันควรจะชัดเจน แต่เมื่อคุณไม่ต้องเสียเวลาคัดลอกวางคำใบ้จาก Intellisense อาจผ่านจมูกของคุณเหมือนที่ฉันทำ :)
Heki

19

หากคุณเป็นเพียงการแสดงผลมูลค่าของทรัพย์สินที่รูปแบบที่คุณไม่จำเป็นต้องDisplayForHTML ผู้ช่วยเพียงโทรโดยตรงกับการจัดรูปแบบที่เหมาะสมสตริง

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

ควรส่งออก

Audit Date: 1/21/2015

สุดท้ายวันที่ตรวจสอบของคุณอาจเป็นโมฆะดังนั้นคุณควรทำการตรวจสอบตามเงื่อนไขก่อนที่จะพยายามจัดรูปแบบค่าที่เป็นโมฆะ

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

Googling ข้อผิดพลาดที่คุณได้รับจะให้คำตอบนี้ซึ่งแสดงให้เห็นว่าข้อผิดพลาดเกิดจากการใช้คำว่า Model ในตัวช่วย Html ของคุณ ตัวอย่างเช่นการใช้@Html.DisplayFor(Model=>Model.someProperty). เปลี่ยนสิ่งเหล่านี้ไปใช้อย่างอื่นที่ไม่ใช่Modelตัวอย่างเช่น@Html.DisplayFor(x=>x.someProperty)หรือเปลี่ยนตัวMพิมพ์ใหญ่เป็นตัวพิมพ์เล็กmในตัวช่วยเหล่านี้


1
ถ้าฉันใช้ @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 - ดูเหมือนว่าคุณยังคงพยายามใส่สิ่งนี้ไว้ในตัวHtml.DisplayForช่วย อย่าทำอย่างนั้น นอกจากนี้คุณแน่ใจหรือไม่ว่ามีการส่งข้อผิดพลาดในบรรทัดนั้นไม่ใช่คุณสมบัติอื่น ๆ ที่คุณพยายามใช้ตัวDisplayForช่วย
Tommy

ถ้าฉันใช้@Model...ฉันได้รับข้อผิดพลาดนี้: 'Model' ขัดแย้งกับระบบการประกาศ.Web.Mvc.WebViewPage <TModel> .Model '
Nick Kahn

@AbuHamzah โปรดดูย่อหน้าสุดท้ายในคำตอบที่อัปเดตของฉัน
Tommy

11

ฉันใช้การเปลี่ยนแปลงนี้ในรหัสของฉัน:

รหัสเก่า:

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

ใหม่:

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

... และ? นี่คือคำตอบหรืออะไร?
Maciej Jureczko

ใช่มันเป็นเพียงการแก้ปัญหาจากหัวเรื่อง ฉันคิดว่านี่อาจเป็นประโยชน์กับใครบางคน
Piotr Mirek

ตกลงฉันขอแนะนำให้คุณเปลี่ยน "ฉันใช้การเปลี่ยนแปลงนี้ในรหัสของฉัน" เป็นสิ่งที่ระบุโดยเฉพาะว่านี่เป็นวิธีแก้ปัญหา
Maciej Jureczko

คำตอบที่ง่ายและสะดวกทำงานให้ฉันขอบคุณ !!
เครื่องสแกน

เกิดปัญหาหาก dataakt เป็นประเภท DateTime?
Emanuele

6

คำตอบของ @ ChrisPratt เกี่ยวกับการใช้ Display Template นั้นผิด รหัสที่ถูกต้องเพื่อให้ใช้งานได้คือ:

@model DateTime?

@if (Model.HasValue)
{
    @Convert.ToDateTime(Model).ToString("MM/dd/yyyy")
}

นั่นเป็นเพราะ.ToString()สำหรับNullable<DateTime>ไม่ยอมรับFormatพารามิเตอร์


5

ฉันใช้สิ่งที่คล้ายกันด้วยวิธีนี้:

  1. ใช้TextBoxForเพื่อแสดงวันที่ในรูปแบบที่ต้องการและทำให้ฟิลด์เป็นแบบอ่านอย่างเดียว
@Html.TextBoxFor(Model => Model.AuditDate, "{0:dd-MMM-yyyy}", new{@class="my-style", @readonly=true})

2. ให้ศูนย์เค้าร่างและศูนย์ชายแดนไปยังกล่องข้อความใน CSS

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

และ ...... เสร็จแล้ว :)


1
แต่ทำไมถึงทำแบบนั้นล่ะ?
CodeCaster

เนื่องจากวิธีอื่น ๆ ไม่ได้ผลสำหรับฉันและมันช่วยฉันในการเข้ารหัสได้มาก นอกจากนี้ผลลัพธ์สุดท้ายยังเป็นแบบอ่านอย่างเดียวและไม่มีเส้นขอบดังนั้นจึงไม่ดูเหมือนกล่องข้อความ
Akshat

5

คุณสามารถใช้แอตทริบิวต์[ DisplayFormat ] บนโมเดลมุมมองของคุณได้เนื่องจากคุณต้องการใช้รูปแบบนี้กับทั้งโปรเจ็กต์

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

4

สำหรับฉันมันก็เพียงพอที่จะใช้

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

2

หลังจากขุดบางอย่างและฉันจบลงด้วยการตั้งค่าThread's CurrentCultureคุ้มค่าที่จะมีCultureInfo ( 'en-US')ในวิธีการดำเนินการของตัวควบคุม:

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

ต่อไปนี้เป็นตัวเลือกอื่น ๆหากคุณต้องการให้มีการตั้งค่านี้ในทุกมุมมอง

เกี่ยวกับCurrentCultureมูลค่าทรัพย์สิน:

ข้อมูลวัฒนธรรมวัตถุที่ถูกส่งกลับโดยคุณสมบัตินี้พร้อมกับวัตถุที่เกี่ยวข้องได้ตรวจสอบรูปแบบเริ่มต้นสำหรับวันเวลา, ตัวเลข, ค่าของสกุลเงินเรียงลำดับของข้อความประชุมปลอกและการเปรียบเทียบสตริง

ที่มา: MSDN CurrentCulture

หมายเหตุ: การCurrentCultureตั้งค่าคุณสมบัติก่อนหน้านี้อาจเป็นทางเลือกหากตัวควบคุมทำงานอยู่แล้วCultureInfo("en-US")หรือใกล้เคียงกับรูปแบบวันที่"MM/dd/yyyy"กันหรือคล้ายกันที่รูปแบบวันที่เป็น

หลังจากตั้งค่าCurrentCultureคุณสมบัติแล้วให้เพิ่มบล็อกโค้ดเพื่อแปลงวันที่เป็น"M/d/yyyy"รูปแบบในมุมมอง:

@{  //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

เหนือ@shortDateLocalFormatตัวแปรมีการจัดรูปแบบด้วยToString("M/d/yyyy")ผลงาน หากToString("MM/dd/yyyy")ถูกนำมาใช้เช่นผมก่อนแล้วคุณท้ายมีชั้นนำปัญหาศูนย์ เช่นเดียวกับที่แนะนำโดยTommy ToString("d") works เช่นกัน จริงๆแล้ว"d"ย่อมาจาก“ Short date pattern”และสามารถใช้กับรูปแบบวัฒนธรรม / ภาษาที่แตกต่างกันได้เช่นกัน

ฉันเดาว่าบล็อกโค้ดจากด้านบนสามารถแทนที่ด้วยวิธีการช่วยเหลือที่ยอดเยี่ยมหรือคล้ายกัน

ตัวอย่างเช่น

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

    @shortDateLocalFormat
}

สามารถใช้กับการโทรตัวช่วยนี้ได้

@DateFormatter(Model.AuditDate)

ปรับปรุงผมพบว่ามีทางเลือกของการทำในสิ่งเดียวกันเมื่อDateTime.ToString (String, IFormatProvider)วิธีการที่ใช้ เมื่อวิธีการนี้ถูกนำมาใช้แล้วมีความจำเป็นต้องใช้ThreadของCurrentCultureสถานที่ให้บริการ CultureInfo("en-US")จะถูกส่งเป็นอาร์กิวเมนต์ที่สอง -> IFormatProviderไปDateTime.ToString(String, IFormatProvider)วิธีการ

วิธีแก้ไขตัวช่วย:

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

    @shortDateLocalFormat
}

.NET ซอ


1

อาจจะลองง่ายๆ

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

คุณยังสามารถใช้รูปแบบสตริงได้หลายประเภทเช่น. ToString ("dd MMM, yyyy") .oString ("d") เป็นต้น


ได้รับข้อผิดพลาด: 'Model' ขัดแย้งกับการประกาศ 'System.Web.Mvc.WebViewPage <TModel> .Model'
Nick Kahn

ถ้าฉันใช้@modelมันไม่รู้จัก
Nick Kahn

@AbuHamzah - ฉันเข้าใจผิดมันเป็นเมืองหลวงMเมื่อใช้ในหน้า HTML ตัวพิมพ์เล็กmเมื่อประกาศ
Tommy

ยังคงได้รับข้อผิดพลาดโปรดดูที่ฉันตอบกลับคำตอบของทอมมี่
Nick Kahn

1
No overload for method 'ToString' takes 1 argumentsบ่นเมื่อฉันใช้ToString("mm/dd/yyyy")
Nick Kahn

1

ในมุมมองแทนที่สิ่งนี้:

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

ด้วย:

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

คำอธิบาย: หากค่า AuditDate ไม่เป็นโมฆะมันจะจัดรูปแบบวันที่เป็น dd / MM / yyyy หรือปล่อยให้เป็นเพราะไม่มีค่า


0

ฉันมีปัญหาคล้ายกันในคอนโทรลเลอร์ของฉันและนี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน:

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

"DateSigned" คือค่าจากโมเดลของฉันบรรทัดอ่านหากค่าโมเดลมีค่าให้จัดรูปแบบค่ามิฉะนั้นจะไม่แสดงอะไรเลย

หวังว่าจะช่วยได้


0

นี่เป็นวิธีที่ดีที่สุดในการรับสตริงวันที่ง่ายๆ:

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

นี่คือสิ่งที่คำตอบนี้: ใช้HtmlStringผลลัพธ์โดยDisplayForแปลงเป็น a Stringแยกวิเคราะห์เป็น a DateTimeแล้วจัดรูปแบบเป็นไฟล์String. ซับซ้อนโดยไม่จำเป็นในความคิดของฉัน
ลิงนอกรีต


-1

ดูคำตอบเกี่ยวกับไฟล์No overload for method 'ToString' takes 1 argumentsข้อผิดพลาดนี้

คุณไม่สามารถจัดรูปแบบ DateTime ที่เป็นโมฆะได้ - คุณต้องใช้คุณสมบัติ DateTime.Value

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

เคล็ดลับ: การทำสิ่งนี้ในคลาสมาตรฐานที่มี intellisense จะเป็นประโยชน์เสมอก่อนที่จะนำไปใช้ในมุมมอง ในกรณีนี้คุณจะได้รับข้อผิดพลาดในการคอมไพล์ซึ่งง่ายต่อการมองเห็นในชั้นเรียน


หากฉันใช้รหัสที่แนะนำแล้วได้รับข้อผิดพลาดนี้ 'Model' conflicts with the declaration 'System.Web.Mvc.WebViewPage<TModel>.Model'
Nick Kahn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.