2017-07-25 81 views
0

我做了一個簡單的Web應用程序,它在本地數據庫上正常工作。發佈後,有一個與DateTime的連接錯誤:ASP.NET MVC的日期時間解析

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

在視圖模型的代碼如下所示:

[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));   
} 

控制器代碼:

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"); 
} 

爲什麼它在本地數據庫工作,爲什麼發佈後出現錯誤?

更新: 這就是我的FutureDate類

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

你可以在'DateTime = viewModel.GetDateTime(),'行中設置一個斷點,並且還可以添加一個觀察者到viewModel來檢查這些值,更好的辦法是發佈截圖... – Hackerman

+3

@Jakubb,可能是問題是您的本地工作站和服務器上的不同語言環境。 –

+0

也可以是通過輸入的日期格式以及Parse方法預期的日期格式。你在UI中輸入什麼格式的日期和時間?你是以軍事時間還是3:45 PM格式輸入時間? –

回答

2

該錯誤可能有事情做與自定義屬性驗證(ValidTimeFutureDate)。這裏沒有其他代碼可能會產生這種異常。

但是,您首先想到的是這種不好的方式,如果您只是以正確的方式進行操作,那麼這甚至不會成爲問題。現在,如果發佈了無效的日期/時間值,您的整個應用程序將會爆炸,所以一般情況下也會有更少的錯誤。

更改您的視圖模型的屬性:

[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; } 

然後,你GetDateTime方法簡單地變爲:

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

通過分別使TimeDate性能TimeSpanDateTime, modelbinder將處理從發佈的字符串值進行的轉換。如果兩者都不能轉換爲它們各自的類型,則會填充默認值(空值),然後觸發Required驗證。您的GetDateTime方法現在不需要解析任何東西;如果它們有價值,它只會將兩者相加。

+0

克里斯,謝謝你的幫助,但仍然不起作用。我在「Date.Add(Time)」 - 「'DateTime?'出錯了。不包含「添加」的定義,也沒有包含接受類型爲「DateTime?」的第一個參數的擴展方法「添加」。可以找到......「所以我增加了價值日期和時間」Date.Value.Add(Time.Value)「。現在我無法在我的表單中添加任何日期。 Ther的錯誤可能與futuredate有關。 – Jakubbb

+0

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。無, out dateTime); return(isValid && dateTime> = DateTime.Now.AddDays(-1)); } } – Jakubbb

+0

我已將futuredate類添加到第一個帖子 – Jakubbb