2012-03-15 39 views
6

Tôi đang viết một ứng dụng ASP.NET MVC3 trong C# và thấy rằng gọi Html.HiddenFor theo quan điểm của tôi sẽ hiển thị DateTime khác (và không đúng) nếu tôi gọi Html.DisplayFor .Html.HiddenFor định dạng DateTime không chính xác trong ASP.NET

Mô hình lấy giá trị của nó từ không có trang trí DisplayFormat và điều này dường như hoạt động với Html.DisplayFor. Thuộc tính trong câu hỏi được viết như sau:

[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] 
public DateTime MeetingStartDate { get; set; } 

Và xem màn hình này sử dụng:

@Html.DisplayFor(model => model.MeetingStartDate) 
@Html.HiddenFor(model => model.MeetingStartDate) 

Cuộc gọi DisplayFor sẽ làm cho ngày như 16/04/2012 tuy nhiên HiddenFor sẽ làm cho nó như value="04/16/2012 00:00:00".

Tôi đã thử thay đổi văn hóa hiện tại để đặt DateTimeFormat nhưng điều này không có hiệu lực.

Văn hóa hiện tại là en-GB nên không nên in ngày en-US.

+1

Nếu giá trị bị ẩn, tại sao nó được định dạng? Có lẽ nó chỉ cần được phân tích cú pháp một lần nữa trên đường trở về ...nếu nó không dành cho * tiêu thụ * con người, định dạng không quan trọng. –

+0

@JonSkeet Đối với một số lý do, điều này làm mất hiệu lực mô hình, im làm việc trong en-GB nhưng nó in ra một ngày en-US. Nhưng * chỉ * cho yếu tố ẩn này –

+1

Bạn có thể sử dụng mẫu trình chỉnh sửa tùy chỉnh Xem câu trả lời: http://stackoverflow.com/questions/8305262/asp-net-mvc-format-of-hidden-datetime –

Trả lời

18

An-view thay thế sử dụng TextBoxFor sẽ làm việc nếu bạn chỉ định định dạng ngày và thuộc tính ẩn html.

@Html.TextBoxFor(model => model.CreatedDate, "{0:dd/MM/yyyy HH:mm:ss.fff}", htmlAttributes: new { @type = "hidden" }) 
0

Trong mô hình của bạn, đối với chức năng Nhận của thuộc tính MeetingStartDate, bạn có thể trả về một DateTime được định dạng không?

DisplayFormat sẽ không hoạt động với giá trị ẩn vì MVC đang tạo giá trị trong trường ẩn có thể được phân tích cú pháp chính xác trong hành động Gửi biểu mẫu từ dữ liệu hiện được đặt cho thuộc tính.

Những gì bạn có là hành động mong đợi của MVC.

+0

Bạn sẽ quay lại như thế nào một ngày được định dạng, tôi nghĩ định dạng chỉ được áp dụng khi bạn chuyển đổi 'DateTime' thành một chuỗi? –

+3

Tôi hiểu rằng bạn muốn sử dụng các thuộc tính để dàn dựng các mục của bạn, nhưng trong trường hợp này bạn sẽ phải sử dụng '@ Html.Hidden (" MeetingStartDate ", model.MeetingStartDate.ToShortDateString())' – bdparrish

+0

Sự kiện nếu tôi sử dụng ToString ("dd/MM/yyyy") nó vẫn sẽ xuất ngày tháng là ngày en-US –

8

Nếu bạn muốn tạo ra một lĩnh vực ẩn mà tôn trọng định dạng mà bạn định nghĩa bạn có thể xác định một mẫu biên tập tùy chỉnh để ghi đè lên một mặc định (~/Views/Shared/EditorTemplates/HiddenInput.cshtml):

@if (!ViewData.ModelMetadata.HideSurroundingHtml) 
{ 
    @ViewData.TemplateInfo.FormattedModelValue 
} 
@Html.Hidden("", ViewData.TemplateInfo.FormattedModelValue) 

và bây giờ bạn trang trí bất động sản mô hình của bạn với [HiddenInput] thuộc tính:

[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] 
[HiddenInput(DisplayValue = false)] 
public DateTime MeetingStartDate { get; set; } 

và theo quan điểm của bạn:

@Html.DisplayFor(model => model.MeetingStartDate) 
@Html.EditorFor(model => model.MeetingStartDate) 

mà sẽ sử dụng định dạng chính xác cho các giá trị ẩn:

<input data-val="true" data-val-required="The MeetingStartDate field is required." id="MeetingStartDate" name="MeetingStartDate" type="hidden" value="15/03/2012" /> 
4

Hoặc bạn có thể outsmart thi HiddenFor và tái sử dụng các TextBoxFor thay vào đó và tự đặt type = "hidden".

Something như thế này:

public static MvcHtmlString HiddenInputFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, object htmlAttributes = null) 
{ 
    IDictionary<string, object> htmlAttributesTmp = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); 
    if (htmlAttributesTmp.ContainsKey("type")) 
    { 
    htmlAttributesTmp["type"] = "hidden"; 
    } 
    else 
    { 
    htmlAttributesTmp.Add("type", "hidden"); 
    } 

    return html.TextBoxFor(expression, htmlAttributesTmp); 
} 
0

nếu bạn cho id như rằng vấn đề không xảy ra

<%= Html.TextBoxFor(model => Model.DiscountRate,new { @id = "DiscountRate", @Value=Model.DiscountRate})%> 
Các vấn đề liên quan