วันที่เท่านั้นจาก TextBoxFor ()


271

ฉันมีปัญหาในการแสดงเฉพาะวันที่ส่วนหนึ่งของ DateTime ลงในกล่องข้อความโดยใช้ TextBoxFor <,> (นิพจน์, htmlAttributes)

โมเดลนี้ใช้ Linq2SQL ฟิลด์เป็น DateTime บน SQL และในโมเดล Entity

ล้มเหลว:

<%= Html.TextBoxFor(model => model.dtArrivalDate, String.Format("{0:dd/MM/yyyy}", Model.dtArrivalDate))%>

เคล็ดลับนี้ดูเหมือนว่าจะคิดค่าเสื่อมราคาค่าสตริงใด ๆ ในวัตถุ htmlAttribute จะถูกละเว้น

ล้มเหลว:

[DisplayFormat( DataFormatString = "{0:dd/MM/yyyy}" )]
public string dtArrivalDate { get; set; }

ฉันต้องการจัดเก็บและแสดงเฉพาะส่วนวันที่ในมุมมองรายละเอียด / แก้ไขโดยไม่มีส่วน "00:00:00"

คำตอบ:


237
[DisplayName("Start Date")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
public DateTime StartDate { get; set; }

แล้ว:

<%=Html.EditorFor(m => m.StartDate) %>

ใช่ตอนนี้มีผู้ช่วยที่ EditorFor และ MVC2 สรุปก็คือวิธีการแก้ปัญหาของคุณเป็นวิธีที่จะไป
Kronos

66
แต่ตอนนี้ Jpery UI datepicker ไม่สามารถใช้กับอินพุตนี้ได้เนื่องจากไม่สนใจแอตทริบิวต์ @ class = "datepicker" ตามที่ระบุไว้ในตัวช่วย Html.EditorFor () ดังนั้นกล่องข้อความนี้จึงจัดรูปแบบอย่างถูกต้อง แต่จะไม่เรียกใช้ datepicker เมื่อคลิก ดังนั้นมันคงที่สิ่งหนึ่งและแตกอีก
แอรอน

5
ฉันจะแสดงให้สอดคล้องกับวิธีแก้ปัญหานี้ได้อย่างไร แต่ให้เปิดตัว datepicker เหมือนที่ทำกับ Html.TextboxFor ()
Aaron

49
ฉันใช้ไวยากรณ์ MVC4 Razor ฟิลด์วันที่จะแสดงผลเป็น@Html.EditorFor(m => m.IssueDate)และการจัดรูปแบบในรูปแบบที่ถูกนำไปใช้[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}" )]แต่วันที่จะยังคงแสดงเป็น01/01/0001 12:00:00 AM
bjan

4
@Aaron ไม่มี EditorForFor ที่มีพารามิเตอร์ htmlAttributes เกินพิกัด คุณอาจส่งต่อไปยังพารามิเตอร์ viewTemplate หรือบางสิ่งบางอย่างโดยคิดว่าคุณกำลังส่ง htmlAttributes นี่คือข้อเสียของ Editorfor TextBoxFor ละเว้นคำอธิบายประกอบ DisplayFormat โซลูชันของ Alexeyss ใช้รูปแบบที่แตกต่างเพื่อแก้ไขปัญหานี้
AaronLS

362

MVC4ได้แก้ไขปัญหานี้โดยการเพิ่มTextBoxForโอเวอร์โหลดใหม่ซึ่งใช้พารามิเตอร์รูปแบบสตริง ตอนนี้คุณสามารถทำได้:

@Html.TextBoxFor(m => m.EndDate, "{0:d MMM yyyy}")

นอกจากนี้ยังมีโอเวอร์โหลดที่ใช้แอตทริบิวต์ html เพื่อให้คุณสามารถตั้งค่าคลาส CSS, วางสาย datepickers และอื่น ๆ :

@Html.TextBoxFor(m => m.EndDate, "{0:d MMM yyyy}", new { @class="input-large" })

40
นี่คือคำตอบที่ดีที่สุดสำหรับ MVC4 - มันช่วยให้ฉันเพื่อใช้ jQuery datepicker UI และรูปแบบการเลือกทำเช่นนี้:@Html.TextBoxFor(m => m.SomeDate, "{0:MM/dd/yyyy}", new { @id="datepicker" })
ericb

3
ขอบคุณ! แต่ดูเหมือนว่าจุดบกพร่องที่ TextBoxFor จะละเว้น[DisplayFormat]แอตทริบิวต์ของโมเดล ดีใจที่มีอย่างน้อยแทนที่ใน TextBoxFor (และคุณแจ้งเตือนฉันเพื่อมัน)
Neil Laslett

7
ฉันตั้งค่าแบบนี้@Html.TextBoxFor(model => model.CDate, "{0:dd.MM.yyyy}")แต่ใน httpPost ฉันได้รับข้อมูลอย่าง MM.dd.yyyy วิธีแก้ปัญหานี้
user007

3
ฉันซื้อเบียร์ให้คุณ! ปัญหาเล็ก ๆ นี้ทำให้ฉันปวดหัวจนฉันพบคำตอบนี้
JoshYates1980

3
FYI : เบราว์เซอร์หลายคนและinput[type=date]ข้อมูลจำเพาะจำเป็นต้องมี"{0:yyyy-MM-dd}"รูปแบบ
KyleMit

259
<%= Html.TextBoxFor(model => model.EndDate, new { @class = "jquery_datepicker", @Value = Model.EndDate.ToString("dd.MM.yyyy") })%>

5
โซลูชัน EditorFor ใช้งานได้ยกเว้นเมื่อคุณต้องการแทนที่แอตทริบิวต์ HTML อื่น ๆ เช่นรหัสหรือคลาส นี่เป็นทางออกที่ดี แปลกที่ V ต้องเป็นตัวใหญ่
Ben Mills

1
หากต้องการจัดการ null อย่างปลอดภัยคุณสามารถใช้ Model.EndDate.GetValueOrDefault () ToString ("dd.MM.yyyy") ค่าเริ่มต้นของ Datetime จะปรากฏขึ้นหาก Model.EndDate เป็นโมฆะ

15
เกี่ยวกับ nulls ค่าเริ่มต้นของวันที่และเวลาเป็น 1 มกราคมของปี 1901 ในความคิดของฉันมันจะดีกว่าที่จะใช้@Value = (Model.DateBecamePermanentResident == null ? "" : Model.DateBecamePermanentResident.Value.ToString("dd.MM.yyyy"))
Serj เซแกน

1
@Spikolynn นี่ไม่ได้สร้างแอตทริบิวต์ 'Value' อันที่สองสำหรับฉัน (เทมเพลต MVC3 / มีดโกน)
Doug S

2
สำคัญ: ตรวจสอบทุน "V" ใน "ค่า" อักษรตัวเล็กจะไม่ทำ!
Tejasvi Hegde

48

หรือใช้ผู้ช่วยที่ไม่ได้พิมพ์:

<%= Html.TextBox("StartDate", string.Format("{0:d}", Model.StartDate)) %>

22
การเปลี่ยนแปลงเล็กน้อย@Html.TextBoxFor(model => model.EndDate, "{0:d}", new { type = "date" })
Dan Friedman

มันใช้ Razor แทนเอ็นจิ้น ASPX view แต่ทั้งคู่ทำงานใน MVC 4 และการเปลี่ยนจากซินแทกซ์หนึ่งไปเป็นอีกอัน ฉันโพสต์ในมีดโกนเพราะนั่นคือสิ่งที่ฉันใช้และทดสอบด้วย อย่างที่ฉันบอกไปมันเป็นความหลากหลาย
Dan Friedman

1
@ Dan Friedman: นี่เป็นวิธีที่จะไปหาฉัน! ฉันเคยทำงานกับเทมเพลตการแก้ไข แต่แล้วฉันก็ต้องสร้าง html ของตัวเองและยังรวมถึงข้อความการตรวจสอบทั้งหมดและแอตทริบิวต์ Bootstrap ทั้งหมดดังนั้นนี่เป็นวิธีที่ดีสำหรับฉัน (asp.net mvc5)
Michel

1
คุณสามารถสร้างปัญหาใหม่และรายละเอียดสิ่งที่คุณทำ แท็กฉันและฉันยินดีที่จะช่วย
Dan Friedman

1
โซลูชันนี้ดีที่สุดเมื่อคุณต้องการโลกาภิวัตน์
alansiqueira27

26

สิ่งนี้ใช้ได้สำหรับฉัน

@Html.TextBoxFor(m => m.DateOfBirth, "{0:MM/dd/yyyy}", new { size = "12", @class = "DOB", tabindex = 121 })

12

อย่ากลัวที่จะใช้ HTML แบบ raw

<input type="text" value="<%= Html.Encode(Model.SomeDate.ToShortDateString()) %>" />

4
ตอนนี้เขาจะโพสต์มันได้อย่างไร เพราะวันที่เท่านั้นแทบจะไม่ได้รับการแยกวิเคราะห์บนเซิร์ฟเวอร์
Robert Koritnik

10
ตราบใดที่คุณใส่ 'name = "StartDate"' ที่ถูกต้องตัวยึดโมเดลจะหยิบมันขึ้นมา
naspinski

@DrJokepu สิ่งเดียวที่คนงานสำหรับฉันใน MVC3 นั่นคือฉันไม่สามารถสร้างTextBoxForหรือจัดEditorForรูปแบบค่าใด ๆ ดูคำถามของฉัน: TextBox สำหรับผู้ช่วยผสมวันและเดือนเข้าด้วยกัน
horgh

10

TL; DR;

@Html.TextBoxFor(m => m.DOB,"{0:yyyy-MM-dd}", new { type = "date")

การสมัคร[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]ไม่ได้ผลสำหรับฉัน!


คำอธิบาย:

เพื่อแสดงคุณสมบัติวันที่ของรุ่นของคุณโดยใช้Html.TextBoxFor:

ป้อนคำอธิบายรูปภาพที่นี่

คุณสมบัติวันที่ของคลาสโมเดลของคุณ:

public DateTime DOB { get; set; }

ไม่มีสิ่งใดที่ต้องการในด้านรูปแบบ


ในมีดโกนที่คุณทำ:

@Html.TextBoxFor(m => m.DOB,"{0:yyyy-MM-dd}", new { type = "date")


คำอธิบาย:

วันที่ของinputองค์ประกอบhtml ที่เป็นประเภทdateจะต้องจัดรูปแบบตามมาตรฐานISO8601ซึ่งก็คือ:yyyy-MM-dd

วันที่แสดงถูกจัดรูปแบบตามโลแคลของเบราว์เซอร์ของผู้ใช้ แต่ค่าที่วิเคราะห์จะถูกจัดรูปแบบเสมอ yyyy-mm-dd

ประสบการณ์ของฉันคือว่าภาษาไม่ได้ถูกกำหนดโดยAccept-Languageส่วนหัว แต่โดยภาษาแสดงเบราว์เซอร์หรือภาษาของระบบปฏิบัติการ


4

คุณยังสามารถใช้แอตทริบิวต์ HTML 5 ได้โดยใช้คำอธิบายประกอบข้อมูลนี้:

[DataType(DataType.Date)]

แต่ปัญหาคือสิ่งนี้ทำให้ตัวเลือกวันที่เฉพาะสำหรับเบราว์เซอร์สำหรับเบราว์เซอร์ HTML 5 คุณยังคงต้องการตัวใช้เลือกวันที่สำหรับเบราว์เซอร์ที่ไม่มีการสนับสนุนจากนั้นคุณต้องตรวจสอบให้แน่ใจว่าตัวเลือกวันที่ของคุณไม่ปรากฏนอกเหนือจากเบราว์เซอร์ (Modernizr สามารถทำได้อย่างง่ายดาย) หรือซ่อนเบราว์เซอร์ถ้ามัน ไม่ทราบวิธีการที่เชื่อถือได้ที่ฉันเห็น)

ในที่สุดฉันก็ไปกับอเล็กซ์เพราะสภาพแวดล้อมปัจจุบันของฉันไม่มี Modernizr แต่ถ้าเป็นเช่นนั้นฉันจะใช้มันเพื่อแสดงตัวเลือกข้อมูลของฉันแบบมีเงื่อนไขเท่านั้นหากเบราว์เซอร์ไม่สนับสนุนอย่างใดอย่างหนึ่ง


3

สำหรับฉันฉันต้องการเก็บไว้TextboxFor()เพราะใช้EditorFor()การเปลี่ยนแปลงประเภทอินพุตเป็นวันที่ ซึ่งใน Chrome นั้นได้เพิ่มตัวใช้เลือกวันที่ในตัวซึ่งทำให้ jQuery datepicker ที่ฉันใช้อยู่นั้นเสียไป ดังนั้นหากต้องการใช้TextboxFor()AND และแสดงเฉพาะวันที่ต่อไปคุณสามารถทำได้:

<tr>
    <td class="Label">@Html.LabelFor(model => model.DeliveryDate)</td>
    @{
        string deliveryDate = Model.DeliveryDate.ToShortDateString();
    }
    <td>@Html.TextBoxFor(model => model.DeliveryDate, new { @Value = deliveryDate }) *</td>
    <td style="color: red;">@Html.ValidationMessageFor(model => model.DeliveryDate)</td>
</tr>

1

แอ็ตทริบิวต์ DisplayFormat ไม่ทำงานสำหรับฉันในรูปแบบใดก็ตามเมื่อโหลดครั้งแรก ฉันสร้าง EditorTemplate แทน:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.DateTime>" %>
<%@ Import Namespace="System.Web.Mvc.Html" %>
<%=
    Html.TextBox("", Model.ToShortDateString(), new { @class = "date-range" }) %>

1

เครื่องมือแก้ไขเทมเพลตจะทำงานเพื่อการแสดงผลเท่านั้น หากคุณใช้โปรแกรมแก้ไขเดียวกัน (ซึ่งสมเหตุสมผลเนื่องจากเป็นเครื่องมือแก้ไข) และคุณระบุค่าเช่น 31/01/2010 - คุณจะได้รับข้อความแสดงข้อผิดพลาดว่ารูปแบบไม่ถูกต้อง


1

ฉันใช้ Globalize เพื่อทำงานกับรูปแบบวันที่มากมายดังนั้นให้ใช้สิ่งต่อไปนี้:

@Html.TextBoxFor(m => m.DateOfBirth, "{0:d}")

การดำเนินการนี้จะปรับรูปแบบวันที่เป็นการตั้งค่าภาษาของเบราว์เซอร์โดยอัตโนมัติ


1

โปรดทราบว่าการแสดงจะขึ้นอยู่กับวัฒนธรรม และในกรณีส่วนใหญ่คำตอบอื่น ๆ ทั้งหมดนั้นถูกต้อง แต่ก็ไม่ได้ผลสำหรับฉัน ปัญหาวัฒนธรรมจะทำให้เกิดปัญหาที่แตกต่างกับ jQuery datepicker ถ้าแนบ

หากคุณต้องการบังคับให้รูปแบบหนี/ในลักษณะต่อไปนี้:

@Html.TextBoxFor(model => model.dtArrivalDate, "{0:MM\\/dd\\/yyyy}")

ถ้าไม่หนีให้ฉันมันแสดง08-01-2010กับที่คาดไว้08/01/2010ไว้

นอกจากนี้หากไม่ได้หนี jQuery datepicker จะเลือก defaultDate May 10, 2012ที่แตกต่างกันในกรณีของฉันมันเป็น


1

หากคุณใช้ตัวเลือกวันที่ Bootstrap คุณสามารถเพิ่มแอททริบิวdata_date_formatตามด้านล่าง

      @Html.TextBoxFor(m => m.StartDate, new { 
@id = "your-id", @class = "datepicker form-control input-datepicker", placeholder = "dd/mm/yyyy", data_date_format = "dd/mm/yyyy" 
})

0

// datimetime แสดงใน datePicker คือ 11/24/2011 12:00:00 AM

// คุณสามารถแยกสิ่งนี้ด้วยช่องว่างและตั้งค่าเป็นวันที่เท่านั้น

สคริปต์:

    if ($("#StartDate").val() != '') {
        var arrDate = $('#StartDate').val().split(" ");
        $('#StartDate').val(arrDate[0]);
    }

มาร์กอัป:

    <div class="editor-field">
        @Html.LabelFor(model => model.StartDate, "Start Date")
        @Html.TextBoxFor(model => model.StartDate, new { @class = "date-picker-needed" })
    </div>

หวังว่าสิ่งนี้จะช่วย ..


7
ทางออกของคุณควรทำงาน แต่ในความเห็นที่ต่ำต้อยของฉันมันอาจเป็นอันตรายได้หากต้องพึ่งพาฝั่งไคลเอ็นต์ในวันที่จัดทำสายอักขระที่ออกในฝั่งเซิร์ฟเวอร์ หากการตั้งค่าภูมิภาคทางฝั่งเซิร์ฟเวอร์ไม่รวมช่องว่างระหว่างวันที่และเวลาโซลูชันที่เปิดเผยของคุณจะล้มเหลว
Kronos

0

แน่นอนว่าคุณสามารถใช้ Html.EditorFor แต่ถ้าคุณต้องการใช้ TextBoxFor และใช้รูปแบบจากแอตทริบิวต์ DisplayFormat คุณสามารถใช้วิธีนี้ได้:

@Html.TextBoxFor(model => model.dtArrivalDate, ModelMetadata.FromLambdaExpression(model => model.dtArrivalDate, ViewData).EditFormatString)

หรือสร้างส่วนขยายถัดไป:

public static class HtmlExtensions
{
    public static MvcHtmlString TextBoxWithFormatFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes)
    {
        return htmlHelper.TextBoxFor(expression, ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).EditFormatString, htmlAttributes);
    }
}

0

เพียงเพิ่มถัดจากโมเดลของคุณ

[DataType(DataType.Date)]
public string dtArrivalDate { get; set; }

0

เมื่อใช้ตัวช่วยแท็กใน ASP.NET Core รูปแบบจำเป็นต้องระบุในรูปแบบ ISO หากไม่ได้ระบุเช่นนี้ข้อมูลอินพุตที่ถูกผูกไว้จะไม่แสดงอย่างถูกต้องและจะแสดงเป็น mm / dd / yyyy โดยไม่มีค่า

รุ่น:

[Display(Name = "Hire")]
[DataType(DataType.Date)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
public DateTime? HireDate { get; set; }

ดู:

<input asp-for="Entity.HireDate" class="form-control" />

รูปแบบสามารถระบุได้ในมุมมองโดยใช้แอ็ตทริบิวต์ asp-format

HTML ที่ได้จะเป็นดังนี้:

<input class="form-control" type="date" id="Entity_HireDate" 
    name="Entity.HireDate" value="2012-01-01">

0

คุณสามารถใช้โค้ดด้านล่างเพื่อพิมพ์เวลาในรูปแบบ HH: mmในกรณีของฉันชนิดคุณสมบัติคือ TimeSpan ดังนั้นค่าที่มาในรูปแบบ HH: mm: ttแต่ฉันต้องแสดงในรูปแบบข้างต้นเช่น HH: mm

ดังนั้นคุณสามารถใช้รหัสนี้:

@Html.TextBoxFor(x =>x.mTimeFrom, null, new {@Value =Model.mTimeFrom.ToString().Substring(0,5), @class = "form-control success" })

0

หากคุณยืนยันที่จะใช้[DisplayFormat]แต่คุณไม่ได้ใช้ MVC4 คุณสามารถใช้สิ่งนี้:

@Html.TextBoxFor(m => m.EndDate, new { Value = @Html.DisplayFor(m=>m.EndDate), @class="datepicker" })
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.