2017-07-25 181 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