【问题标题】:ASP.NET Dynamic Data Entities + primary key on DateTime column = FormatExceptionASP.NET 动态数据实体 + DateTime 列上的主键 = FormatException
【发布时间】:2013-10-01 11:21:50
【问题描述】:

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

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

异常详细信息:System.FormatException:无法识别字符串 作为有效的日期时间。

来源错误:

在执行过程中产生了一个未处理的异常 当前的网络请求。有关原产地和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。

堆栈跟踪:

[FormatException:字符串未被识别为有效的 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
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

我尝试在 web.config 中的 <globalization> 节点中设置文化,但没有帮助。 详细信息页面的 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 节点导致异常消失,但现在 Details 找不到正确的行,说“No such item”。

【问题讨论】:

    标签: entity-framework asp.net-dynamic-data


    【解决方案1】:

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

    【讨论】:

    • 谢谢 Adarsh,你能指导我一些教程或一些我可以找到如何做到这一点的东西吗?正如我所说,这是我的第一个动态数据项目,我还不太了解我的方法。
    • @Caleb9:我绝不会建议您使用 DateTime 数据类型作为主键。这总是一个不好的做法。使用其他一些数据类型,如字符串、整数等,您的问题将得到解决。
    • 这是真的,如果你看看我解决它的方式,那实际上就是问题所在。不幸的是,我无法更改该表,因为它在系统的其他部分中使用,我花了一段时间才弄清楚我可以删除 EF 模型中 DateTime 列的实体键属性。感谢您的帮助。
    【解决方案2】:

    您可能遇到本地化问题,不同国家/地区的日期时间格式可能不同,您在 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");
    

    Taken from msdn

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

    【讨论】:

    • 感谢《冰雪奇缘》。不幸的是,我现在无法更改 SQL 的类型,但我感觉 C# 设置和 SQL 之间可能存在差异。您能指导我在 C# 应用程序范围内的哪个位置设置文化(正如我所说,我尝试了 &lt;globalization culture="..."&gt; 无济于事)?
    • HttpServerUtility.UrlDecodeDecode escaped Url without using HttpUtility.UrlDecode 在这种情况下可能会有所帮助
    • 谢谢,我会对此进行调查。同时我添加了 >Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); >Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");到 Site.master OnInit 事件。异常消失了,但详细信息说“没有这样的项目。”。网址改为“Created=09%2F30%2F2013 16%3A10%3A33&Updated=09%2F30%2F2013 23%3A10%3A40”
    • 我已将其解决到没有异常的地步(通过更改 web.config 中的文化),但随后详细信息页面找不到该项目(我尝试解码您建议的 URL,并以与此处呈现的类似方式 forums.asp.net/post/4854958.aspx,但这没有帮助)。我想我必须尝试更多地了解动态数据的工作原理,然后才能有意识地解决这个问题......
    • @Caleb9 尝试查看模型绑定,您可以为日期时间创建自己的自定义模型绑定器,我想我曾经遇到过您的问题,它只发生在使用 GET 请求而不是 POST 时,因为 post 能够使用正确的文化。此外,您实际上应该始终在获取请求中使用日期的不变文化格式,例如通过使用具有不变日期的隐藏字段并提交它,而不是具有文化特定表示的真实字段。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-22
      • 2012-01-26
      • 1970-01-01
      • 2014-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多