2017-07-25 1 views
0

Ich habe eine einfache Webanwendung gemacht und es funktioniert ordnungsgemäß auf lokalen db. Nach der Veröffentlichung gibt es einen Fehler mit Datumzeit verbunden:ASP.NET MVC DateTime Parse

System.FormatException: String was not recognized as a valid DateTime. 

Der Code in Ansichtsmodell sieht wie folgt aus:

[Required] 
[ValidTime] 
[Display(Name = "Game time")] 
public string Time { get; set; } 
[Required] 
[FutureDate] 
[Display(Name = "Game date")] 
public string Date { get; set; } 
public DateTime GetDateTime() 
{ 
    return DateTime.Parse(string.Format("{0} {1}", Date, Time));   
} 

Controller-Code:

public ActionResult Create(GameFormViewModel viewModel) 
{ 
    if (!ModelState.IsValid) 
     return View("GameForm", viewModel); 
    var userId = User.Identity.GetUserId(); 
    var game = new Game 
    { 
     TeamA = viewModel.TeamA, 
     TeamB = viewModel.TeamB, 
     DateTime = viewModel.GetDateTime(), 
     LeagueId = viewModel.Id, 
     AdminId = userId 

    }; 

    _context.Games.Add(game); 
    _context.SaveChanges(); 


    return RedirectToAction("MyLeagues", "Leagues"); 
} 

Warum ist es Arbeit auf lokalen db und Warum gibt es einen Fehler nach der Veröffentlichung?

Update: Das ist meine FutureDate Klasse

public class FutureDate : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     DateTime datetime; 
     var isvalid = DateTime.TryParseExact(Convert.ToString(value), 
      "dd-mm-yyyy", 
      CultureInfo.CurrentCulture, 
      DateTimeStyles.None, 
      out datetime); 



     return (isvalid && datetime >= DateTime.Now.AddDays(-1)); 

    } 
} 
+0

Sie können einen Haltepunkt in der Zeile 'DateTime = viewModel.GetDateTime() 'setzen und auch einen Beobachter zu viewModel hinzufügen, um die Werte zu überprüfen, noch besser, den Screenshot ... – Hackerman

+3

@Jakubb, wahrscheinlich die Quelle von Das Problem sind die verschiedenen Gebietsschemas auf Ihrer lokalen Arbeitsstation und auf dem Server. –

+0

Auch könnte das Format des Datums über die Eingabe und das Format des Datums von der Parse-Methode erwartet werden. Welches Format von Datum und Uhrzeit geben Sie auf der Benutzeroberfläche ein? Betrittst du Zeit als Militärzeit oder 3:45 PM-Format? –

Antwort

2

Der Fehler wahrscheinlich etwas mit Ihrer benutzerdefinierten Validierung Attribute (ValidTime oder FutureDate) zu tun. Es gibt keinen anderen Code, der möglicherweise diese Ausnahme generieren könnte.

Allerdings, die Art und Weise, wie Sie über diese schlechte in erster Linie gehen, und wenn Sie es einfach den richtigen Weg, wird dies nicht einmal ein Problem sein. Sie werden im Allgemeinen auch weniger Bugs haben. Wenn gerade ein ungültiger Datums-/Uhrzeitwert veröffentlicht wird, wird Ihre gesamte App explodieren.

Ändern Sie die Eigenschaften nach Ihrer Ansicht Modell:

[Required] 
[Display(Name = "Game time")] 
[DataType(DataType.Time)] 
public TimeSpan? Time { get; set; } 

[Required] 
[FutureDate] 
[Display(Name = "Game date")] 
[DataType(DataType.Date)] 
public DateTime? Date { get; set; } 

Dann Ihre GetDateTime Methode einfach wird:

public DateTime GetDateTime() 
{ 
    return Date.HasValue && Time.HasValue ? Date.Add(Time) : default(DateTime); 
} 

Indem die Time und Date Objekte TimeSpan und DateTime bzw. die Modelbinder wird die Konvertierung von den geposteten String-Werten übernehmen. Wenn beide nicht in ihre jeweiligen Typen konvertiert werden können, wird stattdessen der Standardwert (null) ausgefüllt, der dann Ihre Required Validierung auslöst. Ihre GetDateTime Methode muss jetzt nichts mehr analysieren. es fügt nur die beiden zusammen, wenn sie einen Wert haben.

+0

Chris, danke für die Hilfe, aber etwas funktioniert immer noch nicht. Ich habe einen Fehler bei "Date.Add (Time)" - "'DateTime?" enthält keine Definition für 'Hinzufügen' und keine Erweiterungsmethode 'Hinzufügen', die ein erstes Argument vom Typ 'DateTime' akzeptiert? könnte gefunden werden ... "so habe ich Value to Date und time" Date.Value.Add (Time.Value) "hinzugefügt. Jetzt kann ich kein Datum in meinem Formular hinzufügen. Der Fehler ist wahrscheinlich immer mit futuredate verbunden. – Jakubbb

+0

öffentliche Klasse FutureDate: ValidationAttribute { öffentliche Überschreibung bool IsValid (Objektwert) { DateTime dateTime; var isValid = DateTime.TryParseExact (Konvertieren.ToString (Wert), "TT-MM-JJJJ", CultureInfo.CurrentCulture, DateTimeStyles.Keine, out dateTime); Rückgabe (isValid && dateTime> = DateTime.Now.AddDays (-1)); } } – Jakubbb

+0

Ich habe futuredate Klasse zum ersten Beitrag hinzugefügt – Jakubbb

Verwandte Themen