我正在尝试使用VS 2012(C#)中的“ASP.NET动态数据实体Web应用程序”项目模板构建一个简单的网站。它几乎是标准的模板设置,其中一个实体,其中DateTime类型属性是主键的一部分(基础表在映射列上也有SQL DateTime类型)。当我尝试查看“详细信息”页面或编辑行时,我收到FormatException:
字符串未被识别为有效的DateTime。描述:一个 在执行当前Web期间发生了未处理的异常 请求。请查看堆栈跟踪以获取有关的更多信息 错误以及它在代码中的起源。
异常详细信息:System.FormatException:无法识别字符串 作为有效的DateTime。
来源错误:
执行期间生成了未处理的异常 当前的网络请求。有关的来源和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。
堆栈追踪:
[FormatException:String未被识别为有效的DateTime。]
System.Web.UI.WebControls.EntityDataSourceView.ExecuteSelect(DataSourceSelectArguments 参数)+965
System.Web.UI.DataSourceView.Select(DataSourceSelectArguments 参数,DataSourceViewSelectCallback回调)+21
System.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 8 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 8 System.Web.UI.Control.PreRenderRecursiveInternal()+ 168 8 System.Web.UI.Control.PreRenderRecursiveInternal()+ 168 8 System.Web.UI.Control.PreRenderRecursiveInternal()+ 168 8 System.Web.UI.Control.PreRenderRecursiveInternal()+ 168 8 System.Web.UI.Control.PreRenderRecursiveInternal()+ 168 8 System.Web.UI.Page.ProcessRequestMain(布尔 includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint) 974
我尝试在web.config中的<globalization>
节点中设置文化,但它没有帮助。
“详细信息”页面的URL包含查询字符串中的列,如下所示:&amp; Created = 09%2F30%2F2013 16%3A10%3A33&amp; Updated = 09%2F30%2F2013 23%3A10%3A40 for Created is' 30-09-2013 16:10:33'并更新'30 -09-2013 23:10:40'。
这是我的第一个动态数据项目,所以我真的不知道该怎么做...在此先感谢您的帮助。
编辑:
添加
<globalization uiCulture="en-US" culture="en-US"/>
到主web.config的system.web节点导致异常消失,但现在Details无法找到正确的行,说“没有这样的项目。”
答案 0 :(得分: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");
您可以尝试查看这可能是问题,然后您可以查看从配置设置或者查看日期时间的不同模型绑定,有几种解决方案取决于适合您的。
答案 1 :(得分:0)
由于您已将datetime定义为主键,因此在发送get请求时由浏览器进行url编码。在使用之前,您应该在视图中解码此值。 Framework正在尝试将编码值解析为datetime,因为这会给出异常。
答案 2 :(得分:0)
我设法解决了这个问题。事实证明基础表没有定义主键,因此所有NOT NULL列(包括两个DateTime列)在该实体框架实体中推断出该表的实体键属性。将这两个属性的“实体键”属性设置为False后,一切都开始正常工作。
这不是一个通用的解决方案,而是针对此特定情况的更多解决方法,其中行由其他列唯一标识,而不是具有DateTime类型的列。如果我真的有一个DateTime列将成为主键的表,我想我会再遇到同样的问题。
关于FormatException,在system.web节点下的web.config中设置<globalization culture="en-US" />
修复它,但是在从DateTime列中删除Entity Key属性之后,即使这是不必要的,因为DateTime值不用于构造URI了。