2015-08-13 10 views
7

Problem

biegnę przez tutorials for ASP.NET MVC 4 (ale myślę, że byłoby to również zastosowanie do MVC 5), w której stworzenie strony internetowej dla filmu sklep.ASP.NET MVC Zastosuj różne DisplayFormat dla edycji i wyświetlania trybów

Model filmu ma właściwość ReleaseDate typu DateTime. Generalnie ta data będzie wyświetlana więcej niż jest edytowana, więc zastosowałem następujące atrybuty, aby ją ładnie renderować.

[DataType(DataType.Date)] 
[DisplayFormat(DataFormatString = "{0:dd-MMM-yyyy}")] 
public DateTime ReleaseDate { get; set; } 

Kiedy pogląd, że wyświetlacze data ta czyni to za pomocą:

@Html.DisplayFor(model => model.ReleaseDate) 

ona wyświetlona ładnie sformatowany, jak można się spodziewać:

Nicely formatted dates

Ale kiedy widok, który edytuje tej dacie czyni go za pomocą:

@Html.EditorFor(model => model.ReleaseDate) 

wyświetla piękny datę HTML5 kompletacji, ale nie wypełnia wartości ponieważ data jest w (komunikat o błędzie niewłaściwy format jest The specified value '11/01/1989 00:00:00' does not conform to the required format, 'yyyy-MM-dd'. Jest to problem, ponieważ jeśli użytkownik chce edytować wpis , data z kontroli nigdy nie zostanie ustawiona, więc użytkownik nie będzie wiedział, jaka jest poprzednia/aktualna wartość.

enter image description here

pół sposób Rozwiązanie

Roztwór Znalazłem od przeczytaniu innych podobnych pytań jest ustawienie DisplayFormat w modelu do yyyy-MM-dd i sprawiają, ma zastosowanie do kontroli edycyjnych :

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

To działa, w tym, że auto zapełnia wartość na dzień HTML5 kompletacji podczas edycji (za pomocą @Html.EditorFor()):

enter image description here

Ale Utknąłem z brzydkich terminach formacie ISO na kiedy jestem wyświetlania (przy użyciu `@ Html.DisplayFor()):

enter image description here

prawdziwe pytanie

Moje prawdziwe pytanie brzmi: czy mogę mieć różne formaty wyświetlania dla normalnego trybu wyświetlania i edycji, ustawione w modelu?

  • Nie chcę używać pola tekstowego do edycji daty - chcę użyć wyboru daty HTML5; jest o wiele ładniejszy niż przy użyciu pola tekstowego.
  • Nie chcę również zmieniać wszystkich widoków, które wyświetlają datę, aby bezpośrednio pobrać właściwość z modelu i sformatować ją za pomocą niestandardowego formatowania, która neguje punkt atrybutu DisplayFormat.(Chcę użyć @Html.DisplayFor do wyświetlania i @Html.EditorFor do edycji)

Mam nadzieję, że wszystko ma sens - Jestem nowym ASP.NET, więc nie do końca znają te kontrole i atrybutów.

Edit

Co staram się osiągnąć coś takiego:

[DataType(DataType.Date)] 
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] // use this format for edit controls 
[DisplayFormat(DataFormatString = "{0:dd-MMM-yyyy}", ApplyFormatInEditMode = false)] // use this format for display controls 
public DateTime ReleaseDate { get; set; } 

ale nie można mieć dwa atrybuty formatu wyświetlania dla jednej nieruchomości.

+0

Czy * nie * użyć Displayfor? Możesz także użyć @ Model.ReleaseDate.ToString() z ciągiem formatu pasującym do wyjścia, które chcesz. –

+1

@TiesonT. Nie muszę ... jest po prostu tak miło i schludnie. Moim głównym problemem jest to, że używając @ model.ReleaseDate.ToString() z ciągiem formatującym jest to, że ten ciąg formatu musi być powielany wszędzie, gdzie wyświetlana jest data wydania, która ma być o wiele więcej miejsc niż jest edytowana. Właśnie widziałem Twój komentarz w odpowiedzi Backs. – Erresen

Odpowiedz

8

pomocą parametru format metoda TextBoxFor i zastąpić atrybut type:

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

Dzięki, ale jak powiedziałem w pytaniu; Nie chcę używać pola tekstowego dla daty. Jeśli używasz pola tekstowego, nie otrzymasz wyboru daty HTML5. – Erresen

+2

@JamesCrawshaw można zastąpić atrybut type w parametrze htmlAttribute. –

+0

@TiesonT. @Backs To działa! Wielkie dzięki!. Kod, który wykorzystałem, to: '@ Html.TextBoxFor (m => m.ReleaseDate," {0: rrrr-MM-dd} ", htmlAttributes: new {type =" date "})'. @Backs - jeśli edytujesz swoją odpowiedź lub @TiesonT. - jeśli zamieścisz odpowiedź z tym kodem, zaznaczę ją jako odpowiedź. – Erresen