Laden...

[erledigt] Problem beim speichern von Datumswerten

Erstellt von wickedcsharper vor 11 Jahren Letzter Beitrag vor 11 Jahren 4.565 Views
Thema geschlossen
wickedcsharper Themenstarter:in
160 Beiträge seit 2008
vor 11 Jahren
[erledigt] Problem beim speichern von Datumswerten

Hallo zusammen,

Hab jetzt 2 Stunden gesucht und sowohl vieles als auch nichts gefunden.

Problem: ASP MVC 4
Scaffolding von Datenbankinhalten

Ich bekomme Werte einer Person angezeigt, die in der Datenbank (SQL Server)
als DateTime gespeichert sind:

z.B. der Geburtstag wird mir wie folgt angezeigt:
30.09.1971

wenn ich in der View auf save klicke, nimmt er das Datum nicht an.

ich muss es so speichern:
30/09/1971

dann schluckt er es.

Ich habewas mit Globalization gefunden, dass ich in der web.conf speichern soll und mit jQuery Fallback und etliches mehr.
Aber nirgends eine Beschreibung wo was genau einzufügen ist.

Wer kann mir helfen - ich muss das heute (11.01) präsentieren. und würde das gerne noch reinbringen X(

mfg

„Wenn man eine Katze auseinandernehmen will, um zu sehen, wie sie funktioniert, hat man als erstes eine nicht funktionierende Katze in den Händen.“

16.831 Beiträge seit 2008
vor 11 Jahren
  1. Wird ausdrücklich empfohlen, nicht DIREKT DateTime an der Action anzunehmen, sondern einen String und versuchen diesen zu parsen.

  2. Steht in der Doku ebenfalls sehr deutlich, was man machen muss und wo es in der Web.config hingehört:

    <system.web>     
       <globalization enableClientBasedCulture="true" uiCulture="Auto" culture="Auto" />
    </system.web>

Wie Du danach 2 Stunden erfolglos gesucht hast, ist mir ein Rätsel.
Innerhalb 10 Sekunden bekommst Du mindestens 20 Seiten, die das gleiche Problem behandeln und lösen
Google-Suche nach asp mvc datetime culture

Ich hoffe, dass Du das Forum als Hilfequelle in Deiner Dokumentation aufführst.

2.207 Beiträge seit 2011
vor 11 Jahren

Hallo wickedcsharper,

ich hatte hier MVC4 - Datetime-Format beim Bearbeiten genau dasselbe Problem.

Ich bin, wie von Abt vorgeschlagen, dazu übergegangen einfach einen String zu nehmen und einen Validator zu schreiben, in dem ich das Model reingebe und dann schaue, ob sich der String parsen lässt etc. da bist du ja dann relativ frei. Dort kannst du dann auch auf jedwede Culture reagieren etc.

Gruss

Coffeebean

wickedcsharper Themenstarter:in
160 Beiträge seit 2008
vor 11 Jahren

Jo, danke für Eure Hilfe

@abt
ich habe keinen Bock mich jedesmal für meine Fragen rechtfertigen zu müssen.
Ist das ein Forum auch für Themenbeginner oder tummeln sich hier nur Vollprofis ?
Ich habe eine Frage gestellt, nicht aus Faulheit oder Bequemlichkeit, sondern offensichtlich weil ich nach Lösungen suche und bin dankbar für jede Antwort - somit auch Dir.

Ihr Admins müßt euch aber allesamt abgewöhnen, dass Eure Antworten mit Maßregelungen versehen sind und dass man alles was ihr sagt, mit Demut entgegen genommen wird. Denkt daran, dass auch Ihr mal klein angefangen habt und eventuell bei gewissen anderen Themen, die in euere Leben treten auch wieder bei 0 anfangt. Und gewöhnt euch ab, zu glauben, dass es zu jedem Thema des Lebens irgendwo eine Doku gibt... 🤔

@coffeebeen
Danke für den Link 😉

„Wenn man eine Katze auseinandernehmen will, um zu sehen, wie sie funktioniert, hat man als erstes eine nicht funktionierende Katze in den Händen.“

16.831 Beiträge seit 2008
vor 11 Jahren

Darum gehts nicht, sondern hätte ich Dir in dem DB-Thread nicht geholfen.
Geht viel eher darum, dasses einfach selbst über die Forensuche binnen weniger Sekunden zu finden ist =) 👍

wickedcsharper Themenstarter:in
160 Beiträge seit 2008
vor 11 Jahren

Hallo Coffeebeen,

ich muss das Thema nochmal aufgreifen. Datumswerte lassen sich
mit allen Tricks die da im Internet stehen nicht im Format dd.MM.YYYY
also im deutschen Zeitformat abspeichern. Nicht mit selbst gefrickelten
ModelBindern und auch nich mit eigenen Attributklassen - Ich habe alles probiert - Nichts !!!!!! einfach nichts.
Das ist ehrlich gesagt ziemlicher Murks (vor allem wenn man die Aufgabe hat eine Terminverwaltung zu schreiben)

Ihr mögt Recht behalten und ich muss in ASP Net MVC das ganze als String speichern.

Wie sieht denn dann die Validierung aus. ich muss ja dann bei den Controllern zusehen,
dass wenigsten ordemntliche Werte abgespeichert werden.
Normalerweise hab ich ja sowas @Html.ValidationMessageFor(model => model.Geburtstag)
aber wenn das nun ein String ist geht ja alles durch ?

„Wenn man eine Katze auseinandernehmen will, um zu sehen, wie sie funktioniert, hat man als erstes eine nicht funktionierende Katze in den Händen.“

16.831 Beiträge seit 2008
vor 11 Jahren

Ich halte von den eingebauten Validierungen nichts.
Alle meine Entities und alle meine SubmitModels erben alle von IValidatableObject; dadurch kann ich jedem Entity eine eigene Validierung geben:



public abstract class SubmitModelBase : IValidatableObject
{
    public abstract Boolean IsValid( out ReadOnlyCollection<ValidationResult> validationResults );
}

public class TerminCreateSubmitModel: SubmitModelBase 
{
   public String StartTermin { get; set; }
   public DateTime ParsedStartTermin { get; private set; }

   public override bool IsValid( out ReadOnlyCollection<ValidationResult> validationResults )
    {
        var l = new List<ValidationResult>( );

        var dt = default(DateTime);

        if ( String.IsNullOrEmpty( StartTermin ) )
        {
            NewError( l, "StartTermin ", "Kein StartTermin übermittelt." );
        } else if(!DateTime.ParseExact(..... out dt)
        {
            NewError( l, "StartTermin ", "Ungültiges Format StartTermin." );
        }

        // Parsed Valued
        ParsedStartTermin = dt;

        validationResults = new ReadOnlyCollection<ValidationResult>( l );
        return ( l.Count == 0 );
    }
}

[Http]
public AR TerminCreateSubmit(TerminCreateSubmitModel submitModel)
{
    ReadOnlyCollection<ValidationResult> errors;
    if(!submitModel.IsValid( out errors))
    {
        // Alle Fehler ins ViewModel übertragen und an den Client zurück schicken.
    }

}


Client-Seitig validiere ich nur durch HTML5-Attribute.
HtmlHelpers sind ne nette Idee aber für mich unbrauchbar, da ich ViewModels, SubmitModels und Entities sauber trenne. Zudem sind sie grotten unperformant.
PS: ich verwende auch kein ModelState.

wickedcsharper Themenstarter:in
160 Beiträge seit 2008
vor 11 Jahren

Hallo Abt,

vielen Dank für die Ausführungen !
Dein Code ist soweit schlüssig - aber poohh ein ganz schöner Aufwand

Ich hoffe, dass hier bzgl. MVC 4 noch nachgebessert wird.
Ich meine Datumswerte sind ja für manche Dinge fundamental.
Je nach dem möchte man ja auch über SQL Queries mal Abfragen machen,
die nach Datum filtern. Da ist es natürlich schlecht, wenn alles nur als String gespeichert ist.

Mit den Strings ist meines Erachtens nur ein schlechter Kompromiss 🤔

Vielleicht hat ja wer noch ne Lösung mit jquery. Ich habe hier einen Link, habe es aber noch nicht ausprobiert. Angeblich haben die am Schluss der Diskussion eine Lösung:
hier

„Wenn man eine Katze auseinandernehmen will, um zu sehen, wie sie funktioniert, hat man als erstes eine nicht funktionierende Katze in den Händen.“

3.511 Beiträge seit 2005
vor 11 Jahren

Da ist es natürlich schlecht, wenn alles nur als String gespeichert ist.

Nein, das hast du falsch verstanden. Schau dir nochmal Abt's Beispiel an (StartTermin <-> ParsedStartTermin) 😃
Die Daten in der Datenschicht (SQL, NoSQL oder whatever) halten natürlich alles als DateTime. Aus dem Model wird irgendwann ein Poco oder vice versa. Entweder hält jetzt das Model schon die passende DateTime Property, oder beim Mappen zum Poco kommt es erst ins Spiel.

@Abt:
Auch wenn es nicht hier hingehört, magst du mal kurz den Ansatz mit IValidatableObject erklären, vorallem die Clientseitige Validierung?

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

wickedcsharper Themenstarter:in
160 Beiträge seit 2008
vor 11 Jahren

Hallo Khalid,

mir ist schon bewusst was der Code soll 😉 Aber dennoch handelt es sich um eine "Krückenlösung".
Das Entity Framework muss bei einer eingestellten Ländereinstellung das Datum in entsprechenden Format annehmen können. Das bedeutet, wenn ich ein Datum im deutschen Format angebe, muss die Datenbank das fressen.

Das String nach Date gefrickel ist suboptimum. Egal wie schön Abts Klassen dazu sind.

Angenommen ich möchte über javascript Auswertungen von Terminen machen:
@{
var db = Database.Open("WebTerminContext");
var query = "SELECT Datumvon, Datumbis FROM from Termine Where Datumvon between ......
}

dann wird das wohl so nicht mehr gehen.

Ich schau mal weiter, obs nicht doch irgendeine Lösung gibt, mit der man einen Datetime abspeichern kann

„Wenn man eine Katze auseinandernehmen will, um zu sehen, wie sie funktioniert, hat man als erstes eine nicht funktionierende Katze in den Händen.“

wickedcsharper Themenstarter:in
160 Beiträge seit 2008
vor 11 Jahren

Nun - keine Antworten mehr ?
Ich auch nicht...

Man kann in der Web.conf
folgendes eingeben, um wenigstens das Datum als Datum abspeichern zu können:
<system.web>
<globalization culture="en-US" uiCulture="auto" />

Das Datum oder auch Zeitangaben werden eben direkt im englisch-US dargestellt
aber aufpassen mit mm/dd/yyyy und eben nicht wie im deutschen dd.mm.yyyy

Ich versuche mal ob es mit älteren Techniken besser geht ( WebForms )

Ich frage mich nur allen Ernstes gerade , ob nicht PHP die bessere Wahl darstellt
oder gleich Ruby ?

„Wenn man eine Katze auseinandernehmen will, um zu sehen, wie sie funktioniert, hat man als erstes eine nicht funktionierende Katze in den Händen.“

16.831 Beiträge seit 2008
vor 11 Jahren

Wenn Du meinst, dass PHP oder Ruby die bessere Wahl ist - bitte.
Keiner zwingt Dich ASP zu nutzen.
Wenn Du jetzt mit WebForms anfangen willst, dann hast Du offensichtlich auch nicht kapiert, wofür MVC und wofür WebForms gedacht ist bzw. konzipiert wurde.

Was Du hier machst scheint aber eine ziemliche vergewaltigung OOP darzustellen:
Wer um Himmels wissen öffnet eine DB-Verbindung in einer View? Was soll denn das für eine Anwendungsarchitektur darstellen?
Offensichtlich hast Du Dir nicht mal die Mühe Gedanken über die Architektur zu machen geschweige denn die DB-Schicht abzukapseln.

Und wo ist das Problem mit dem Sortieren?
Zu meinem oberen Beispiel:


List<Entity> entities;
using(var entityRepository = new EntityRepository(context))
{
   entities = entityRepository.NewEntriesSince( submitModel.ParsedStartTime );
}

Aber ich häng mich nun aus dem Thread aus.
Wurde alles gesagt und ich zwing niemanden was auf.

wickedcsharper Themenstarter:in
160 Beiträge seit 2008
vor 11 Jahren

Hallo zusammen,

und nun zum Thema Lokalisierung von Datum und Dezimalwerten
doch noch eine Lösung: Damit in einer ASP MVC Anwendung Datumswerte
im Format 30.09.1971 und Dezimalwerte im Format 10,21 gespeichert werden können, bedarf es
einer kleinen JavaScript Datei mit folgendem Inhalt:

/*
 * Localized default methods for the jQuery validation plugin.
 * Locale: DE
 */
jQuery.extend(jQuery.validator.methods, {
	date: function(value, element) {
		return this.optional(element) || /^\d\d?\.\d\d?\.\d\d\d?\d?$/.test(value);
	},
	number: function(value, element) {
		return this.optional(element) || /^-?(:question:\d+|\d{1,3}(:question:\.\d{3})+)(:question:,\d+)?$/.test(value);
	}
});

das Ganze speichert Ihr als methods_de.js im Projektordner unter Scripts ab.

Im Create und Edit cshtml Formular eurer Anwendung fügt ihr unten folgende Zeile ein,
sodass das Seitenende so aussieht:

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")

    <script src="@Url.Content("~/Scripts/methods_de.js")" type="text/javascript"></script>

Nun sollte es funktionieren.

So einfach kann die Lösung sein. Keine Modellbinder, kein Stringgefrickel und schon funktioniert auch die Eingabe von "echten" Datumswerten 🙄

Gruß

TS

„Wenn man eine Katze auseinandernehmen will, um zu sehen, wie sie funktioniert, hat man als erstes eine nicht funktionierende Katze in den Händen.“

16.831 Beiträge seit 2008
vor 11 Jahren

Noch als Hinweis für die Nachwelt:
Funktioniert nicht mehr, sobald Javascript deaktiviert ist (was für viele Unternehmen gilt, oder auch NoScript-User).
Die sicherere Methode, um möglichst viel Browser und Anwender zuverlässig zu erreichen, ist also weiterhin mit String-Eingaben zu arbeiten.

wickedcsharper Themenstarter:in
160 Beiträge seit 2008
vor 11 Jahren

dynamische Webseiten ohne javascript ?
Das ganze Windows 8 basiert doch auf HTML5 und javascript (jQuery).

Ich meine grundlegend hast du ja recht, aber nur weil ein Mitarbeiter
bei der Dresdner Bank mit inaktivem Java surft, soll ich in meine Anwendung
Tage/Wochenlange Mehrarbeit stecken ? Wer JavaScript deaktiviert, weis warum.
Der weiss aber halt auch, dass er auf dynamischen Webseitengenuss weitestgehend verzichten muss.
Pech gehabt...

Komischerweise funktioniert mit WebForms alles optimal.

„Wenn man eine Katze auseinandernehmen will, um zu sehen, wie sie funktioniert, hat man als erstes eine nicht funktionierende Katze in den Händen.“

F
174 Beiträge seit 2007
vor 11 Jahren

dynamische Webseiten ohne javascript ?

Natürlich.
Was genau verstehst du unter einer dynamischen Website? Das hat nämlich zunächst mal nichts mit JavaScript zu tun.
Für mich wäre eine Seite, die ausschließlich unter Verwendung von JavaScript funktioniert irgendwie unfertig.

16.831 Beiträge seit 2008
vor 11 Jahren

Pech gehabt...

Mit so einer Einstellung kommst Du im Web nicht weit. 👍
Viel Erfolg!

Komischerweise funktioniert mit WebForms alles optimal.

😁

Ich mach trotzdem mal zu.
Das Problem ist ja "gelöst" und es sollte keine weitere Diskussion stattfinden - worauf dies ansonsten wahrscheinlich hinausläuft.

Thema geschlossen