【问题标题】:asp.net mvc datetime dynamic validation by clients date formatasp.net mvc datetime 通过客户端日期格式动态验证
【发布时间】:2013-05-01 15:20:56
【问题描述】:

我有一个用于 DateTime 验证的自定义属性,它具有给定的 dateformat 以及 javascript 验证器,它们为我提供客户端和服务器端验证。但是现在我应该更改我的日期时间验证,以便根据客户本地日期时间格式执行它,我不知道如何。

我找不到任何可以帮助我的东西。

所以请告诉我如何至少实现客户端 DateTime 验证,或者如何通过 javascript 获取客户端的日期格式。

【问题讨论】:

    标签: javascript asp.net-mvc datetime validation


    【解决方案1】:

    如果您可以确定用户的语言环境,则可以使用 .Net 全球化类来协助服务器端解析日期时间字符串。例如:

    // Parsed as January 4th
    var dt1 = DateTime.Parse("1/4/2013", new CultureInfo("en-US"));
    
    // Parsed as April 1st
    var dt2 = DateTime.Parse("1/4/2013", new CultureInfo("en-GB"));
    

    但最好的办法是完全避免这种情况。在您的 JavaScript 代码中,将值作为 ISO8601 字符串返回 - 这是文化不变的。本机浏览器对此的支持各不相同。内置函数可在 IE9+ 中运行。

    // This returns an ISO formatted date, in UTC.
    var s = yourDate.ToISOString();
    

    获得完整浏览器支持并在不转换为 UTC 的情况下获得 ISO 日期的一种方法是使用 moment.js 库,其中 ISO8601 是默认格式:

    // This returns an ISO formatted date, with the user's local offset.
    var s = moment(yourDate).format();
    
    // This returns an ISO formatted date, in UTC.
    var s = moment(yourDate).utc().format();
    

    当您将这些值发送到服务器时,您可以在您的 .Net 代码中解析它们而无需考虑文化。格式已经是文化不变的。为了防止服务器的时区受到干扰,您应该将它们解析为DateTimeOffset

    // assuming this is an ISO value you got from the client:
    var s = "2013-04-20T09:00:00-07:00";
    
    // simply parse it
    var dto = DateTimeOffset.Parse(s);
    
    // if you don't care about the offset at this point:
    var dt = dto.DateTime;
    

    当然,如果你想优雅地失败,你可以这样做:

    DateTimeOffset dto;
    var isValid = DateTimeOffset.TryParse(s, out dto);
    

    【讨论】:

    • 非常感谢您的回答,但实际上我的问题是验证用户的日期输入,以便按照他们的文化的 DateTime 格式正确格式化,否则不允许发布。
    • @Gohar - 你需要知道他们的文化背景,然后你可以使用DateTime.TryParse。还有一些关于检测用户文化信息的其他问题。
    猜你喜欢
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多