2010-09-17 17 views
21

Mam pole DateTime w moim modelu. Gdy próbuję użyć tego pola w silnym typie widoku częściowego ten sposóbPole DateTime i pomocnik Html.TextBoxFor(). Jak korzystać z niego poprawnie?

<%= Html.TextBoxFor(model => model.DataUdienza.ToString("dd/MM/yyyy"), new { style = "width: 120px" }) %> 

będzie otrzymuję następujący błąd kompilacji w czasie wykonywania

System.InvalidOperationException : Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions. 

Zresztą gdybym go używać usunięcie formatowania, toString ("dd/MM/rrrr"), wszystko działa, ale pole jest sformatowane przy użyciu części czasowej, której w ogóle nie potrzebuję.

Gdzie robię źle? Który jest właściwy sposób radzenia sobie z tym?

dzięki za pomoc!

EDIT

Jest to deklaracja nieruchomość w klasie modelu

[Required] 
[DisplayName("Data Udienza")] 
[DataType(DataType.Date)] 
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")] 
public DateTime DataUdienza { get; set; } 

Odpowiedz

12

Utwórz szablon edytora o nazwie DateTime.ascx

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.DateTime?>" %> 
<%=Html.TextBox("", (Model.HasValue ? Model.Value.ToString("MM/dd/yyyy") : string.Empty), ViewData) %> 

umieścić go w folderze views/Shared/EditorTemplates. Teraz, gdy zadzwonisz:

<%= Html.EditorFor(model => model.DataUdienza) %> 

Twoja data będzie formatowana bez czasu.

Stanie się tak ze wszystkimi DateTimes zwanych ten sposób, choć ...

niestandardowych atrybutów HTML mogą być używane w ten sposób:

<%= Html.EditorFor(model => model.DataUdienza, new {customAttr = "custom", @class = "class"}) %> 

To przechodzi do EditorTemplate jak ViewData.

19
<%= Html.EditorFor(model => model.DataUdienza) %> 

A w modelu:

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

DR awback with EditorFor jest to, że nie można zastosować niestandardowych atrybutów html do wygenerowanego pola. Jako alternatywę można użyć TextBox pomocnika:

<%= Html.TextBox("DataUdienza", Model.Date.ToString("dd/MM/yyyy"), new { style = "width: 120px" })%> 
+0

Wow! Super szybko. Dziękuję :) Spróbuję. Ale w międzyczasie, jak to działa, jeśli pole jest typu Nullable? – Lorenzo

+0

Działa tak samo dla typów zerowych. –

+0

Próbowałem zastosować twoje rozwiązanie, ale niestety to nie działa. Mam zamiar edytować post, aby dodać deklarację właściwości modelu dla twoich informacji. – Lorenzo

20

używam tego w MVC 4. działa również ~

@Html.TextBoxFor(x => x.DatePurchase, "{0:yyyy-MM-dd}", new { @class = "dateInput", @placeholder = "plz input date" }) 
+1

Dzięki bardzo ładne rozwiązanie. ale naprawdę muszę zobaczyć, dlaczego nie użył informacji o kulturze ustawień określonych w konfiguracji sieci. – Desmond

+0

To wykonało zadanie dla mnie, dzięki! –

2

Przynajmniej jeśli przy użyciu maszynki do golenia, można wymienić szablon, dzięki czemu nie trzeba używać tego samego szablonu dla wszystkich DateTimes:

@Html.EditorFor(m => m.StartDate, "Date") 

gdzie Data.cshtml zawiera TextBoxFor lub jakiś inny edytor, jak @JungleFreak wyjaśnił:

@model DateTime? 

@Html.TextBox("", Model.HasValue ? Model.Value.ToShortDateString() : string.Empty, 
    new { data_datepicker = true }) 
1

Może metodę rozszerzenia mogą być tworzone:

public static MvcHtmlString DateTimeFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) 
    { 
     var compilationResult = expression.Compile(); 
     TValue dateValue = compilationResult((TModel)html.ViewDataContainer.ViewData.Model); 
     var body = (MemberExpression)expression.Body; 
     return html.TextBox(body.Member.Name, (Convert.ToDateTime(dateValue)).ToCustomDateFormat(), new { id = body.Member.Name, datepicker = true }); 
    } 

metoda ToCustomDateFormat może być metoda rozszerzenie dla typów datetime która zwraca wartość ciągu w żądanym formacie.

Zastosowanie:

@Html.DateTimeFor(x=>x.AnyDateTimeProperty) 

działało w porządku dla mnie (dla DateTime i DateTime? właściwości), choć nie jestem pewien, czy kompilacji wyraz okresie czasu jest dobrym pomysłem.

Powiązane problemy