Datetime字段自动转换为本地(无法编辑)

时间:2012-10-17 08:45:11

标签: c# .net sql-server-2008 datetime asp.net-mvc-4

我正在尝试使用this tutorial来了解更多关于MvC4的信息,但我对Datetime字段有一些问题。

第一个问题
当我尝试使用此格式的datetime创建条目时:DD/MM/YYYY(例如20/06/2012),我收到错误消息:

  

字段ReleaseDate必须是日期

所以我猜它需要采用这种格式(一般来说是默认的):MM/DD/YYYY(例如06/20/2012)。

当我使用第二种格式时,我收到一条消息:

  

值'06 / 20/2012'对于ReleaseDate无效。

我可以让它工作的唯一方法是当我输入月份和日期<= 12时。 12/12/2012

第二个问题
这是关于时间的。假设我输入12/12/2012,我就可以成功创建一个条目。默认情况下,它会选择12:00:00 pm作为时间戳。事情是,而不是pm它进入μμ(这是希腊语中的pm,因为我的电脑中的时钟是希腊语)

当我尝试编辑条目时,我因此而收到错误。如果我将μμ改为pm,则接受它。但它很奇怪,有点讨厌从有效条目中获取错误而不改变任何东西。

第三个问题(奖金)
我有一个数字字段。我输入例如199并接受它。但在我的列表中,它显示为199,00。当我再次尝试编辑并单击“保存”时,出现此错误:

  

字段价格必须是数字。

如果我删除了逗号而00又删除了它..

正如你可以看到它是一个非常有问题的表格:)任何帮助我解决任何问题的答案都非常受欢迎。

理想情况下,我希望这种格式的日期时间:DD/MM/YYYY hh:mm:ss(没有下午和24小时)

但如果我至少可以在没有错误的情况下进行编辑和保存,我会很高兴:)

1 个答案:

答案 0 :(得分:2)

有三件重要的事情:

  1. 在表单
  2. 中呈现日期时间字段时使用的格式
  3. 用于验证客户端上日期时间字段的格式
  4. 用于验证服务器上日期时间字段的格式
  5. 理想情况下,这3种格式必须相同。您提到您正在使用希腊文化,因此您可以先在web.config中配置它:

    <globalization culture="el-GR" uiCulture="el-GR"/>
    

    在此阶段,显示日期时间字段和验证服务器上日期时间字段的格式为dd/MM/yyyy,因为这是el-GR文化使用的格式。

    客户端验证是另一个故事。它不受您的服务器配置的影响。它受客户端浏览器的设置和文化的影响。因此,即使您已将服务器配置为使用el-GR验证日期时间(如果您将客户端浏览器配置为使用en-US文化,则客户端验证将使用MM/dd/yyyy格式。

    因为客户端验证首先运行(假设您已启用jquery不显眼验证),将使用en-US格式,即使20/06/2012值对您的服务器端文化有效,它也不适用于客户端文化。要解决此问题,您需要使用jquery.globalize插件。因此,假设您希望使用el-GR文化,则需要在HTML文档末尾添加必要的脚本:

    <script type="text/javascript" src="~/Scripts/jquery-1.8.2.js"></script>
    <script type="text/javascript" src="~/Scripts/jquery.validate.js"></script>
    <script type="text/javascript" src="~/Scripts/jquery.validate.unobtrusive.js"></script>
    <script type="text/javascript" src="~/Scripts/globalize.js"></script>
    <script type="text/javascript" src="~/Scripts//globalize.culture.el-GR.js"></script>
    <script type="text/javascript">
        $.validator.methods.date = function (value, element) {
            return this.optional(element) ||
                !isNaN(Globalize.parseDate(value));
        }
        $.validator.methods.number = function (value, element) {
            return this.optional(element) ||
                !isNaN(Globalize.parseFloat(value));
        }
    
        Globalize.culture('el-GR');
    </script>
    

    注意如何覆盖date插件的numberjquery.validate方法,以便在解析这些值时使用jquery.globalize插件。

    当然,在页面中包含如此多的脚本并不是一件好事。在ASP.NET MVC 4中,您可以捆绑它们:

    BundleTable.Bundles.Add(
        new ScriptBundle("~/bundles/scripts")
            .Include("~/Scripts/jquery-1.8.2.js")
            .Include("~/Scripts/jquery.validate.js")
            .Include("~/Scripts/jquery.validate.unobtrusive.js")
            .Include("~/Scripts/globalize.js")
            .Include("~/Scripts/globalize.culture.el-GR.js")
            .Include("~/Scripts/myscript.js")
    );
    

    其中myscript.js将包含重写的验证方法:

    $.validator.methods.date = function (value, element) {
        return this.optional(element) ||
            !isNaN(Globalize.parseDate(value));
    }
    $.validator.methods.number = function (value, element) {
        return this.optional(element) ||
            !isNaN(Globalize.parseFloat(value));
    }
    Globalize.culture('el-GR');
    

    现在,您可以使用单个捆绑包替换布局中的所有脚本:

    <!DOCTYPE html>
    <html>
    <head>
        <meta name="viewport" content="width=device-width" />
        <title>Index</title>
    </head>
    <body>
        ...
    
        @Scripts.Render("~/bundles/scripts")
    </body>
    </html>
    

    最后一步是解决在输入字段中呈现日期时间字段的值时使用的格式。当您使用Html.EditorFor()帮助程序为相应的模型属性生成输入字段时,此帮助程序将默认使用当前区域性。因此,例如,如果您有一个DateTime字段并且在web.config中将文化设置为el-GR,则该值将如下呈现:

    20/10/2012 12:21:22 μμ
    

    如果要删除时间部分,可以使用[DisplayFormat]属性修饰视图模型上的DateTime字段,并指定要使用的自定义格式:

    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
    public DateTime SomeDateField { get; set; }
    

    请记住,这仅指定呈现值时使用的格式。不要混淆我之前提到的验证。