Ngày chỉ từ TextBoxFor ()


271

Tôi gặp sự cố khi hiển thị phần ngày duy nhất của DateTime vào hộp văn bản bằng TextBoxFor <,> (biểu thức, htmlAttribution).

Mô hình dựa trên Linq2Query, trường là DateTime trên SQL và trong mô hình Thực thể.

Thất bại:

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

Thủ thuật này dường như không được dùng nữa, mọi giá trị chuỗi trong đối tượng htmlAttribution đều bị bỏ qua.

Thất bại:

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

Tôi muốn lưu trữ và chỉ hiển thị phần ngày trên chế độ xem chi tiết / chỉnh sửa mà không có phần "00:00:00".

Câu trả lời:


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

Sau đó:

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

Vâng, như bây giờ đã có trình trợ giúp EditorFor và MVC2 được hoàn thành, giải pháp của bạn là cách để đi
Kronos

66
Nhưng bây giờ, công cụ hẹn giờ của Jquery UI không thể được áp dụng cho đầu vào này, vì nó bỏ qua các thuộc tính @ class = "datepicker" của tôi như được chỉ định cho trình trợ giúp Html.EditorFor (). Vì vậy, hộp văn bản này bây giờ định dạng chính xác, nhưng không khởi chạy một ngày tháng khi nhấp vào. Vì vậy, nó cố định một điều và phá vỡ một điều khác.
Aaron

5
Làm cách nào tôi có thể làm cho nó hiển thị phù hợp với giải pháp này, nhưng cũng có thể khởi chạy chương trình hẹn hò giống như đã làm với Html.TextboxFor ()
Aaron

49
Tôi đang sử dụng cú pháp MVC4 Razor, trường ngày được hiển thị dưới dạng @Html.EditorFor(m => m.IssueDate)và định dạng trên mô hình được áp dụng [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}" )]nhưng ngày vẫn được hiển thị là01/01/0001 12:00:00 AM
bjan

4
@Aaron Không có quá tải EditorFor có tham số htmlAttribut. Có lẽ bạn đang chuyển nó vào tham số viewTemplate hoặc thứ gì đó, nghĩ rằng bạn đang truyền htmlAttribution. Đây là nhược điểm của Editorfor. TextBoxFor bỏ qua chú thích DisplayFormat. Giải pháp của Alexeyss áp dụng định dạng khác nhau để giải quyết vấn đề này.
AaronLS

362

MVC4 đã giải quyết vấn đề này bằng cách thêm một TextBoxForquá tải mới , trong đó có một tham số định dạng chuỗi. Bây giờ bạn có thể chỉ cần làm điều này:

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

Ngoài ra còn có một tình trạng quá tải có các thuộc tính html, vì vậy bạn có thể thiết lập lớp CSS, kết nối các bộ ngày tháng, v.v .:

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

40
Đây là câu trả lời tốt nhất cho MVC4 - nó cho phép tôi sử dụng công cụ cập nhật giao diện người dùng jquery và định dạng lựa chọn thực hiện điều này:@Html.TextBoxFor(m => m.SomeDate, "{0:MM/dd/yyyy}", new { @id="datepicker" })
ericb

3
Cảm ơn bạn! Nhưng có vẻ như một lỗi mà TextBoxFor bỏ qua [DisplayFormat]thuộc tính của mô hình . Vui mừng có ít nhất một ghi đè trong TextBoxFor (và bạn đã cảnh báo tôi về điều đó).
Neil Laslett

7
Tôi đặt nó như thế này @Html.TextBoxFor(model => model.CDate, "{0:dd.MM.yyyy}")nhưng trên httpPost tôi nhận được dữ liệu như MM.dd.yyyy. Làm thế nào để giải quyết điều này?
dùng007

3
Tôi đang mua bia cho bạn! Vấn đề nhỏ này khiến tôi đau đầu như vậy cho đến khi tôi tìm thấy câu trả lời này.
JoshYates1980

3
FYI : Nhiều trình duyệtinput[type=date]thông số kỹ thuật yêu cầu "{0:yyyy-MM-dd}"định dạng.
KyleMit

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

5
Giải pháp EditorFor hoạt động, ngoại trừ khi bạn cần ghi đè các thuộc tính HTML khác như id hoặc lớp. Đây là một giải pháp tuyệt vời. Lạ là chữ V cần phải viết hoa.
Ben Mills

1
Để xử lý null an toàn, bạn có thể thực hiện Model.EndDate.GetValueOrDefault (). ToString ("dd.MM.yyyy"). Giá trị mặc định của Datetime sẽ được hiển thị nếu Model.EndDate là null.

15
Về null, giá trị mặc định của DateTime là ngày 1 tháng 1 năm 1901, theo tôi, sẽ tốt hơn khi sử dụng@Value = (Model.DateBecamePermanentResident == null ? "" : Model.DateBecamePermanentResident.Value.ToString("dd.MM.yyyy"))
Serj Sagan

1
@Spikolynn, điều này không tạo ra thuộc tính 'Giá trị' thứ hai cho tôi (mẫu MVC3 / dao cạo).
Doug S

2
NGAY LẬP TỨC: Kiểm tra vốn "V" trong "Giá trị", thư nhỏ sẽ không làm!
Tejasvi Hegde

48

Hoặc sử dụng các trợ giúp chưa được đánh dấu:

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

22
Biến thể nhẹ@Html.TextBoxFor(model => model.EndDate, "{0:d}", new { type = "date" })
Dan Friedman

Nó sử dụng dao cạo thay vì công cụ xem ASPX, nhưng cả hai đều hoạt động trong MVC 4 và thay đổi từ cú pháp này sang cú pháp khác là không đáng kể. Tôi đã đăng trong Dao cạo vì đó là những gì tôi đã sử dụng và thử nghiệm. Như tôi đã nói, đó là một biến thể.
Dan Friedman

1
@Dan Friedman: Đây là con đường dành cho tôi! Tôi đã từng làm việc với một mẫu trình soạn thảo, nhưng sau đó tôi cũng phải tạo html của riêng mình và cũng bao gồm tất cả các thông báo xác thực VÀ tất cả các thuộc tính Bootstrap, vì vậy đây thực sự là cách phù hợp với tôi (asp.net mvc5)
Michel

1
Bạn có thể tạo một vấn đề mới và chi tiết những gì bạn đã làm. Tag tôi và tôi sẽ vui lòng giúp đỡ.
Dan Friedman

1
Giải pháp này là tốt nhất khi bạn cần toàn cầu hóa.
alansiqueira27

26

Điều này làm việc cho tôi.

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

12

Đừng sợ sử dụng HTML thô.

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

4
Làm thế nào anh ấy sẽ gửi nó trở lại sau đó? Bởi vì ngày chỉ gần như chắc chắn sẽ không được phân tích lại trên máy chủ.
Robert Koritnik

10
Miễn là bạn bao gồm 'name = "StartDate" thích hợp, trình kết dính mô hình sẽ chọn nó.
naspinski

@DrJokepu điều duy nhất mà worker dành cho tôi trên MVC3. Đó là tôi thất bại trong việc tạo ra TextBoxForhoặc EditorForđịnh dạng giá trị dù sao đi nữa. Xem câu hỏi của tôi: Trình trợ giúp TextBoxFor trộn ngày và tháng theo ngày
horgh

10

TL; DR;

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

Áp dụng [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]đã không làm việc cho tôi!


Giải trình:

Để hiển thị thuộc tính ngày của mô hình của bạn bằng cách sử dụng Html.TextBoxFor:

nhập mô tả hình ảnh ở đây

Tài sản ngày của lớp mô hình của bạn:

public DateTime DOB { get; set; }

Không có gì khác là cần thiết về phía người mẫu.


Trong Dao cạo bạn làm:

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


Giải trình:

Ngày của một inputphần tử html loại datephải được định dạng theo ISO8601 , đó là:yyyy-MM-dd

Ngày hiển thị được định dạng dựa trên ngôn ngữ của trình duyệt của người dùng, nhưng giá trị được phân tích cú pháp luôn được định dạng yyyy-mm-dd.

Kinh nghiệm của tôi là, ngôn ngữ không được xác định bởi Accept-Languagetiêu đề, mà bởi ngôn ngữ hiển thị trình duyệt hoặc ngôn ngữ hệ điều hành.


4

Bạn cũng có thể sử dụng các thuộc tính HTML 5 bằng cách áp dụng chú thích dữ liệu này:

[DataType(DataType.Date)]

Nhưng vấn đề là điều này cho phép trình chọn ngày cụ thể của trình duyệt cho trình duyệt HTML 5. Bạn vẫn cần trình chọn ngày của riêng mình cho các trình duyệt mà không cần hỗ trợ, và sau đó bạn phải đảm bảo rằng trình chọn ngày của bạn không xuất hiện ngoài trình duyệt (Modernizr có thể thực hiện việc này một cách dễ dàng) hoặc ẩn trình duyệt nếu nó (phức tạp và tôi không biết làm thế nào đáng tin cậy phương pháp tôi đã thấy).

Cuối cùng tôi đã đi với Alex vì môi trường hiện tại của tôi không có Modernizr, nhưng nếu có, tôi đã sử dụng điều đó để chỉ hiển thị trình chọn dữ liệu của mình nếu trình duyệt chưa hỗ trợ.


3

Đối với tôi, tôi cần phải giữ TextboxFor()vì sử dụng EditorFor()thay đổi loại đầu vào thành ngày. Mà, trong Chrome, thêm một công cụ chọn ngày được tích hợp sẵn, nó đã làm hỏng trình hẹn giờ jQuery mà tôi đang sử dụng. Vì vậy, để tiếp tục sử dụng TextboxFor()VÀ chỉ xuất ngày, bạn có thể làm điều này:

<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

Thuộc tính DisplayFormat không hoạt động với tôi dưới bất kỳ hình thức nào khi tải ban đầu. Tôi đã tạo một EditorTemplate thay thế:

<%@ 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

Trình chỉnh sửa mẫu sẽ chỉ hoạt động cho mục đích hiển thị. Nếu bạn sử dụng cùng một trình soạn thảo (điều này hợp lý vì đó là trình chỉnh sửa) và bạn đã cung cấp một giá trị như 31/01/2010 - bạn sẽ nhận được thông báo lỗi cho biết định dạng không hợp lệ.


1

Tôi sử dụng Toàn cầu hóa để làm việc với nhiều định dạng ngày nên sử dụng như sau:

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

Điều này sẽ tự động điều chỉnh định dạng ngày theo cài đặt ngôn ngữ của trình duyệt.


1

Hãy nhớ rằng hiển thị sẽ phụ thuộc vào văn hóa. Và trong khi trong hầu hết các trường hợp, tất cả các câu trả lời khác đều đúng, nó không hoạt động với tôi. Vấn đề về văn hóa cũng sẽ gây ra các vấn đề khác nhau với công cụ hẹn hò jQuery, nếu được đính kèm.

Nếu bạn muốn buộc thoát định dạng /theo cách sau:

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

Nếu không thoát cho tôi, nó hiển thị 08-01-2010so với dự kiến08/01/2010 .

Ngoài ra, nếu không thoát jQuery datepicker sẽ chọn defaultDate khác, trong trường hợp của tôi là như vậy May 10, 2012.


1

Nếu bạn đang sử dụng bộ chọn ngày Bootstrap, thì bạn chỉ có thể thêm thuộc tính data_date_format như bên dưới.

      @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 hiển thị trong datePicker là 24/11/2011 12:00:00 AM

// bạn có thể chia phần này theo dấu cách và chỉ đặt giá trị thành ngày

Kịch bản:

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

Đánh dấu:

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

Hy vọng điều này sẽ giúp ..


7
Giải pháp của bạn nên làm việc. Nhưng theo quan điểm khiêm tốn của tôi, có thể nguy hiểm nếu dựa vào phía khách hàng vào ngày chuỗi được hình thành ở phía máy chủ. Nếu cài đặt khu vực ở phía máy chủ không bao gồm khoảng trắng giữa ngày và thời gian, giải pháp tiếp xúc của bạn sẽ thất bại.
Kronos

0

Chắc chắn bạn có thể sử dụng Html.EditorFor. Nhưng nếu bạn muốn sử dụng TextBoxFor và sử dụng định dạng từ thuộc tính DisplayFormat, bạn có thể sử dụng nó theo cách này:

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

hoặc tạo phần mở rộng tiếp theo:

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

Chỉ cần thêm bên cạnh mô hình của bạn.

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

0

Khi sử dụng trình trợ giúp thẻ trong ASP.NET Core, định dạng cần được chỉ định ở định dạng ISO. Nếu không được chỉ định như vậy, dữ liệu đầu vào bị ràng buộc sẽ không hiển thị đúng và sẽ hiển thị dưới dạng mm / dd / yyyy không có giá trị.

Mô hình:

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

Lượt xem:

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

Định dạng cũng có thể được chỉ định trong dạng xem bằng thuộc tính định dạng asp.

HTML kết quả sẽ như sau:

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

0

Bạn có thể sử dụng mã bên dưới để in thời gian ở định dạng HH: mm , Trong trường hợp của tôi Loại thuộc tính là TimeSpan Vì vậy, giá trị sẽ đến ở định dạng HH: mm: tt nhưng tôi phải hiển thị ở định dạng trên tức là. HH: mm

Vì vậy, bạn có thể sử dụng mã này:

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

0

Nếu bạn khăng khăng sử dụng [DisplayFormat], nhưng bạn không sử dụng MVC4, bạn có thể sử dụng điều này:

@Html.TextBoxFor(m => m.EndDate, new { Value = @Html.DisplayFor(m=>m.EndDate), @class="datepicker" })
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.