1

我正在尝试使用 VS 2012 (C#) 中的“ASP.NET 动态数据实体 Web 应用程序”项目模板构建一个简单的网站。这几乎是标准模板设置,其中 DateTime 类型属性是主键的一部分的实体(基础表在映射列上也具有 SQL DateTime 类型)。当我尝试查看详细信息页面或编辑一行时,我得到了 FormatException:

字符串未被识别为有效的日期时间。说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.FormatException:字符串未被识别为有效的 DateTime。

源错误:

在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。

堆栈跟踪:

[FormatException:字符串未被识别为有效的 DateTime。]
System.Web.UI.WebControls.EntityDataSourceView.ExecuteSelect(DataSourceSelectArguments 参数)+965
System.Web.UI.DataSourceView.Select(DataSourceSelectArguments 参数,DataSourceViewSelectCallback 回调)+21
系统。 Web.UI.WebControls.DataBoundControl.PerformSelect() +138
System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +30
System.Web.UI.WebControls.FormView.DataBind() +4
System.Web.UI.WebControls .BaseDataBoundControl.EnsureDataBound() +105 System.Web.UI.WebControls.FormView.EnsureDataBound() +178
System.Web.UI.WebControls.CompositeDataBoundControl.CreateChildControls() +75 System.Web.UI.Control.EnsureChildControls() +83 System.Web.UI.Control.PreRenderRecursiveInternal() +42
System.Web.UI.Control.PreRenderRecursiveInternal () +168
System.Web.UI.Control.PreRenderRecursiveInternal() +168
System.Web.UI.Control.PreRenderRecursiveInternal() +168
System.Web.UI.Control.PreRenderRecursiveInternal() +168
System.Web.UI.Control .PreRenderRecursiveInternal() +168
System.Web.UI.Control.PreRenderRecursiveInternal() +168
System.Web.UI.Page.ProcessRequestMain(布尔includeStagesBeforeAsyncPoint,布尔includeStagesAfterAsyncPoint) +974

我尝试<globalization>在 web.config 的节点中设置文化,但没有帮助。详细信息页面的 URL 包含查询字符串中的列,如下所示: &Created=09%2F30%2F2013 16%3A10%3A33&Updated=09%2F30%2F2013 23%3A10%3A40 对于 Created 为 '30-09- 的行2013 年 16 点 10 分 33 秒和更新的“2013 年 9 月 30 日 23 点 10 分 40 秒”。

这是我的第一个动态数据项目,所以我真的不知道该怎么做......在此先感谢您的帮助。

编辑:

添加

<globalization uiCulture="en-US" culture="en-US"/>

到主 web.config 的 system.web 节点导致异常消失,但现在详细信息找不到正确的行,说“没有这样的项目”。

4

3 回答 3

0

我设法解决了这个问题。结果发现基础表没有定义主键,因此所有 NOT NULL 列(包括两个 DateTime 列)都在该表的 Entity Framework 实体中推断出 Entity Key 属性。将这两个属性的“实体键”属性设置为 False 后,一切都开始正常工作。

这不是一个通用的解决方案,而是针对这种特殊情况的一种解决方法,其中行由其他列唯一标识,而不是具有 DateTime 类型的列。如果我真的有一张表,其中 DateTime 列是主键,我想我会再次遇到同样的问题。

关于 FormatException,<globalization culture="en-US" />在 system.web 节点下的 web.config 中设置修复了它,但是在从 DateTime 列中删除 Entity Key 属性之后,即使这是不必要的,因为 DateTime 值不再用于构造 URI。

于 2013-10-03T11:58:27.933 回答
0

您可能遇到本地化问题,不同国家/地区的日期时间格式可能不同,并且您在 c# 和 sql 中使用的格式也不同

尝试以不变的格式提交,例如yyyy-mm-dd

此外,您应该使用 datetimeoffset 作为您的日期时间,如果我记得正确,它具有更高的精度并占用相同的空间,或者至少使用 datetime2 作为您的 sql 数据类型,因为它具有更高的精度并且占用相同或更少的空间。

更新:正如 Adarsh 所建议的那样,解析值可能是一个问题,您可以以编程方式更改您的文化:

// Put the using statements at the beginning of the code module
using System.Threading;
using System.Globalization;
// Put the following code before InitializeComponent()
// Sets the culture to French (France)
Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");
// Sets the UI culture to French (France)
Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR");

取自 msdn

您可以尝试看看这是否可能是问题所在,然后您可以从配置中进行设置,或者查看日期时间的不同模型绑定,根据适合您的方式,有几种解决方案。

于 2013-10-01T11:26:59.170 回答
0

由于您已将 datetime 定义为主键,因此在发送 get 请求时它由浏览器进行 url 编码。在使用它之前,您应该在视图中解码此值。框架正试图将编码值解析为日期时间,并且因为这个给出异常。

于 2013-10-01T11:28:26.660 回答