konto usunięte

Temat: DateTime na widoku

Witam

Mam dość śmieszny problem. W bazie danych mam pole typu date, po zaimportowaniu modelu do Entity pole to zostało sklasyfikowane jako DateTime.
Przekazujac ten model na widok otrzymuje wartość : 2012-03-09 00:00:00

Jak pozbyć się godziny ?
używając metody

@Html.TextBoxFor(model => model.Birthday.ToShortDateString())


dostaje bład Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.

Jak można sformatować tą date aby nie pokazywać godziny?

konto usunięte

Temat: DateTime na widoku

A próbowałeś:

private DateTime _birthday;
public DateTime Birthday
{
get
{
return _birthday.ToShortDateString();
}
set
{
this._birthday = value;
}
}

Swoją drogą jak masz wersję SQL Server 2008 to zamień format kolumny Datetime na Date.

konto usunięte

Temat: DateTime na widoku

w bazie danych format kolumny ustawiony jest na date, w c# jest jedynie DateTime co utrudnia

konto usunięte

Temat: DateTime na widoku

W ogólności to o czym piszesz to kwestia prezentacji. Mogą być różne potrzeby odnośnie sposobu wyświetlenia daty zależnie np. od kultury.
Tak czy inaczej: jak bym zrobił własny Display/Editor Template sterowany przez UIHint

konto usunięte

Temat: DateTime na widoku

chyba najprościej @Html.TextBoxFor(model => model.Birthday.ToString().Substring(0,10))

konto usunięte

Temat: DateTime na widoku

ja używam DisplayFormat(DataFormatString = "{0:d}") Daje ci formę skróconą i nie martwisz się o nulle.

konto usunięte

Temat: DateTime na widoku

Najbardziej eleganckim rozwiązaniem wydaje mi się ze będzie zdefiniowanie tego już na poziomu modelu

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


Dodatkowo
Jeżeli stosujesz Jquery do do wstawiania daty
możesz zabezpieczyć:
np:

$("#Kalendarz").datepicker
({
dateFormat: 'yy-mm-dd',
showStatus: true,
showWeeks: true,
highlightWeek: true,
numberOfMonths: 1,
showAnim: "scale",
showOptions: {
origin: ["top", "left"]
}
});

Gdy chcesz już w jakiś zwariowany hipsterski sposób walidować datę to polecam:

[RegularExpression("((?:(?:[1]{1}\\d{1}\\d{1}\\d{1})|(?:[2]{1}\\d{3}))[-:\\/.](?:[0]?[1-9]|[1][012])[-:\\/.](?:(?:[0-2]?\\d{1})|(?:[3][01]{1})))(?![\\d])")]
[Display(Name = "Data")]
public DateTime Data { get; set; }


A jeżeli używasz czystego modelu i nie chcesz tracić wpisanych danych po odświeżeniu możesz spróbować:

@if(Model ==null)
{@Html.TextBoxFor(m => m.Data, new { Value = DateTime.Today.ToString("yyyy-MM-dd"), ID = "Kalendarz" })}
else{@Html.TextBoxFor(m => m.Data, new { ID = "Kalendarz" })}


oczywiście DateTime.Today.ToString("yyyy-MM-dd") możesz zastąpić dowolnym helperemGrzegorz Zalewski edytował(a) ten post dnia 13.03.12 o godzinie 21:51
Anna R.

Anna R. REQB | ISTQB

Temat: DateTime na widoku

Problem pojawia sie, gdy korzystasz z podejścia DataBase First - tutaj jedynym sensownym rozwiązaniem jest pierwsza podpowiedź Bogdana, ewentualnie kombinowanie z ViewModelami.
Niestety Razor mocno ogranicza dostęp do funkcji tekstowych. Też się na to niedawno nadziałam.

konto usunięte

Temat: DateTime na widoku

Wiem, że się powtarzam ale zrobię to z premedytacją, mianowicie kwestii prezentacji nie powinno się osadzać na modelu danych - jeżeli już to na tym Modelu z MVC.

Wyobraźmy sobie nie taki kosmiczny przypadek, że sposób prezentacji liczb/daty jest zależny nie tylko od kultury ale również od parametrów znanych dopiero w runtime np. preferencji użytkownika.
Sam się spotkałem z takim oczekiwaniem ostatnio: jeżeli Excel potrafi prezentować liczby np. tak: 1 000 000,00 to dlaczego moja aplikacja tego nie potrafi?

Tak czy inaczej nie mieszajmy bazy danych z kwestią prezentacji.
Łukasz L.

Łukasz L. Programista C# .NET

Temat: DateTime na widoku

Anna R.:
Problem pojawia sie, gdy korzystasz z podejścia DataBase First - tutaj jedynym sensownym rozwiązaniem jest pierwsza podpowiedź Bogdana, ewentualnie kombinowanie z ViewModelami.
Niestety Razor mocno ogranicza dostęp do funkcji tekstowych. Też się na to niedawno nadziałam.

Nie jest to problemem, bo EF wygeneruje klasy częściowe, wtedy taka klasę należy opatrzyć atrybutem MetadataTypeAttribute i wskazać klasę metadanych, na której właściwościach można zastosować atrybuty prezentacyjne/walidacyjne.
http://msdn.microsoft.com/en-us/library/system.compone...

W każdym bądź razie zgadzam się z Maciejem. Model w MVC to nie model z EF znajdujący się w tym samym projekcie (w zasadzie w każdym projekcie większym niż "mały" architektura powinna odseparować to od siebie). To, co napisałem wyżej często może znaleźć swoje zastosowanie przy użyciu np. WCF RIA Services i MVVM. Wtedy zastosowanie atrybutów prezentacyjnych/walidacyjnych w modelu danych, zostanie ładnie odwzorowane przez RIA w modelu warstwy prezentacji MVVM.
Sam model w MVC/MVVM/MVP może to być zupełnie inny byt (znany tylko modelowi jako elementowi danego wzorca - np. usługa WCF). Kwestia semantyki i nazewnictwa - model to składowa MVC, która reprezentuje "coś", a "model" danych używany przez EF to już zagadnienie persystencji danych.Łukasz L. edytował(a) ten post dnia 18.03.12 o godzinie 16:48

Następna dyskusja:

MySQL Workbench problem z d...




Wyślij zaproszenie do