2012-08-31 18 views
8

Trong những ngày trước khi asp.net 4.5 chúng ta có thể dễ dàng liên kết ngày với Gridview, Formview hoặc điều khiển dữ liệu khác và làm cho nó trông có thể trình bày với một định dạng đơn giản chuỗi.Sử dụng mô hình mới Binding trong asp.net 4.5 để định dạng các trường ngày

  <asp:TextBox 
       ID="DateFieldTextBox" 
       runat="server" 
       Text='<%# Bind("DateField","{0:d}") %>'/> 

Kiểu mô hình mới, được nhập mạnh mẽ khó hơn một chút.

  <asp:TextBox 
       ID="DateFieldTextBox" 
       runat="server" 
       Text='<%# BindItem.DateField %>'/> 

sẽ hoạt động, nhưng tạo chuỗi ngày/giờ đầy đủ thay vì chỉ ngày tháng.

  <asp:TextBox 
       ID="DateFieldTextBox" 
       runat="server" 
       Text='<%# BindItem.DateField.ToShortDateString() %>'/> 

.. điều này sẽ hoạt động, nhưng nó tạo ra lỗi thời gian biên dịch "Cú pháp mã không hợp lệ cho BindItem". Item.DateField.ToShortDateString() hoạt động nhưng không ràng buộc trên postback.

Hiện tại, chúng tôi đã hoàn nguyên về cú pháp cũ, nhưng chúng tôi muốn có được kiểm tra thời gian biên dịch hiện đại nhưng vẫn có thể định dạng ngày tháng một cách độc đáo. Bất cứ ai khác đã gặp phải điều này trước đây?

+0

cũng không hoạt động khi thử cách này: ''<% # string.Format (CultureInfo.CurrentCulture," {0: d} ", BindItem.InfoBirthday)%>'', nó nói: Lỗi trình biên dịch Thông báo: CS0103: Tên 'BindItem' không tồn tại trong ngữ cảnh hiện tại –

+0

http://stackoverflow.com/questions/17824427/how-do-i-format-a-date-pulled-from-a-database/17831740 # 17831740 – SK2185

+0

http://stackoverflow.com/questions/17824427/how-do-i-format-a-date-pulled-from-a-database/17831740#17831740 – SK2185

Trả lời

2

Để hiển thị dữ liệu trong chế độ xem lưới, bạn có thể thực hiện Item.DateField.ToShortString() và nó sẽ hoạt động vì nó là một cách liên kết dữ liệu. tức là bạn đang displying những gì có trong hồ sơ rồi. BindItem.DateField.ToDateString() sẽ chuyển đổi đối tượng từ DateTime thành chuỗi sẽ gây ra lỗi như bạn đã thấy. Bạn có thể tiếp tục sử dụng Bind (biểu thức, định dạng) trong formview trong khi chỉnh sửa trường hoặc để nhập mục mới.

0

Xin lỗi vì đã phục hồi chuỗi này, nhưng bạn có cân nhắc thêm Chú thích dữ liệu vào lớp mô hình của mình không? Nói cách khác:

using System.ComponentModel.DataAnnotations; 

[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)] 
public DateTime DateField { get; set; } 

Điều này có vẻ phù hợp với tôi, mặc dù tôi không biết cụ thể về trường hợp của bạn.

1

Tôi đã vật lộn với điều này trong một thời gian khá dài. Giải pháp của tôi là kết hợp các chú thích dữ liệu trong mô hình dữ liệu cùng với việc sử dụng một DynamicControl trong FormView của tôi. Tôi đã giả định đây là một dự án WebForms so với một dự án MCV.

Đọc một chút về lĩnh vực data access in WebForms. Đây là một trong những bài viết tốt nhất của MS về các điều khiển truy cập/trình bày dữ liệu WebForms và bao gồm các tham chiếu đến DynamicControl.

//I know you want this, and I did too. It seems like it could/should work, but it doesn't   
<asp:TextBox 
    ID="DateFieldTextBox" 
    runat="server" 
    Text='<%# BindItem.DateField.ToShortDateString() %>'/> 

//This works, but you also need to use the Data Annotations in your model. 
<asp:DynamicControl 
    ID="DateFieldTextBox" 
    runat="server" 
    DataField="DateField" 
    Mode="Edit" /> 

//sample model annotations in your object class 
    [Column(TypeName = "date"), DataType(DataType.Date), DisplayFormat(DataFormatString = " {0:MM/dd/yyyy}", ApplyFormatInEditMode = true)] 
    public DateTime DateField { get; set; } 

tôi sẽ sử dụng mô hình này bởi vì tôi cần mô hình hai chiều gắn với khả năng trình bày ngày theo định dạng đúng (cũng như tiền tệ, vv). Thật không may là việc điều khiển TextBox không xử lý định dạng dữ liệu mô hình như thế này một cách đầy đủ. DataAnnotations được bỏ qua trong bối cảnh này. Liên kết hai chiều hoạt động nếu không có định dạng, nhưng không phải nếu bạn cần định dạng. Dường như IMO triển khai WebForms không đầy đủ.

Mặt khác, sử dụng công cụ DynamicControl, nhưng bạn không nhận được Intellisense trên thuộc tính DataField để cung cấp cho bạn thành viên của mô hình trong khi mã hóa. Gì???? Một giải pháp chưa hoàn thiện và ít được ưu tiên hơn.

+0

Ý tưởng ở đây làm việc cho tôi (ràng buộc trong một bộ lặp). Chú thích thuộc tính với DisplayFormat và sử dụng DynamicControl thay vì BindItem.Bind. Intellisense cũng làm việc bên trong điều khiển động, điều này rất hay. – PaulTheCyclist

1

Cuối cùng sau khi đấu tranh trong hai ngày, tôi nhận được giải pháp cho vấn đề ràng buộc mô hình hai chiều này cho giá trị trường được định dạng. Chỉ cần xóa dấu ngoặc đơn hoặc dấu ngoặc kép "" hoặc "" sau văn bản thuộc tính của TextBox. Nó làm việc cho tôi như một sự quyến rũ !! Nhưng nếu bạn sử dụng thuộc tính TextMode của TextBox thành Date, hãy loại bỏ nó. Nguyên nhân, nó sẽ không hiển thị một giá trị từ máy chủ hoặc DB. Nếu bạn muốn sử dụng một datepicker hoặc lịch, bạn có thể đơn giản thêm một điều khiển AJAX CalendarExtender để chọn một ngày từ lịch.

<asp:TextBox ID="DateFieldTextBox" runat="server" Text=<%# Bind("DateField","{0:d}") %>/> 
Các vấn đề liên quan