2014-02-27 39 views
8

我需要在日期格式“29-12-2014”中使用datepicker存储SQL Server数据库,但是我得到消息字段XXX必须是日期。jQuery日期选择器中的日期模型

我最后的尝试是正则表达式:

型号#1:

[RegularExpression(@"([3][0,1]|[0-2]\d)-([1][0-2]|[0]\d)-(\d\d\d\d)", ErrorMessage = "Valor inválido.")] 
public Nullable<DateTime> ETD { get; set; } 

型号#2:

[DataType(DataType.DateTime)] 
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd-MM-yyyy}")] 
public Nullable<DateTime> ETD { get; set; } 

查看:

<div class="editor-field"> 
    @Html.TextBoxFor(model => model.ETD) 
    @Html.ValidationMessageFor(model => model.ETD) 
</div> 

的jQuery:

$(function() { 
    $("#ETD").datepicker(); 
}); 

我总是收到消息“字段ETD必须是日期。”

有什么想法?

谢谢。

+0

只是胡乱猜测,也许还可以利用 '$( “#ETD”)日期选择器( {DATEFORMAT: “DD-MM-YYYY”}。 );' – devqon

+0

感谢您好,我已经尝试过,但它仍然没有工作:( – Patrick

+0

我有类似的东西,但它只在safari和IE浏览器没有工作,铬是好的。你尝试过跨浏览器吗? – devqon

回答

7

它我的理解,格式为“DD-MM-YYYY”的问题,在这里。 jquery unobtrusive验证尝试实例化一个新的Date(strVal)对象,并且它不知道如何处理字符串'29 -12-2014'。

Unobtrusive validation in Chrome won't validate with dd/mm/yyyy

magritte回答说重新定义了不显眼的验证日期的方法,使用jQuery Globalize的图书馆,与所需的格式字符串解析要解决的问题:

$.validator.methods.date = function (value, element) { 
    return this.optional(element) || Globalize.parseDate(value, "dd-MM-yyyy", "en"); 
} 

更新

我在本地重新创建了您的问题,并且能够在表单发布之前复制'必填字段验证未触发'问题,当全球化图书馆没有安装。一旦我安装并加载了库,前端按预期工作,通过不显眼的验证接受修改后的dd-MM-yyyy日期。

该库可以使用NuGet包管理器和以下软件包进行安装:http://www.nuget.org/packages/jquery-globalize/。然后,您需要更新您的html以包含globalize.js脚本。

后端是另一个故事,它将依赖您本地机器的全球化配置文件。我假设你正在运行这种格式可能解析的非en/us机器?我的机器是英文/我们,本身不解析修改日期格式,但是使用下面的命令,我顺利地拿到了一个有效的日期时间:

DateTime.ParseExact(Request.Form["ETD"], "dd-MM-yyyy", System.Globalization.CultureInfo.InvariantCulture); 
+0

嗨,谢谢,但如果我将此代码应用到我的页面,视图中的所有其他必填字段将被忽略,并且页面被冒充 – Patrick

+0

声音就像有一个JavaScript错误 - 检查你的控制台。您需要下载/包含jQuery全球化库才能运行。 https://github.com/jquery/globalize和NuGet @ http://www.nuget.org/packages/jquery-globalize/ – DanS

+0

嗨,谢谢,但似乎来自@sipwiz的答案对我来说工作得很好,jQuery .validator.methods [“date”] = function(value,element){return true; },所以任何想法为什么你不工作?它似乎是一样的。在网站的其他部分有关验证的后果是什么?也许没有,因为我们只适用于日期类型? – Patrick

2

这应该设置在文本框中输入格式:

$("#ETD").datepicker({ 
    dateFormat : 'dd-mm-yy' 
}); 

是从jQuery的或C#来验证消息?看到前面的答案:https://stackoverflow.com/a/19519745/1803682

+0

嗨,谢谢,但我已经测试过,但没有解决问题。现在我认为DanS的回应解决了它 – Patrick

+0

同意 - 我upvoted @丹斯,因为它是一个更好的具体实现我解决方案链接(*我认为*)。 – Matthew

+0

;)但无论如何,谢谢你的亲切帮助。 – Patrick

0

的几件事情在本地化您的应用程序正在进行。

This Phil Haack article通过它。这很旧,但我想所有的概念都是一样的。

+0

嗨,谢谢,但是也许最简单的解决方案可以解决问题? – Patrick

2

随着@DanS我能够拟订的日期验证的解决方案为我的国家的帮助下,葡萄牙(PT-PT),这里是任何人的完整的解决方案具有验证日期的问题:

所有的

首先,你需要安装NuGet包:

http://www.nuget.org/packages/jquery-globalize/

然后在页面中包含要进行验证(或捆绑像我)的链接,核心库和您的国家的文化档案(注:首先放置核心,然后是文化档案,否则你会得到一个未定义的错误)

bundles.Add(new ScriptBundle("~/bundles/saida").Include(
      "~/Scripts/Presenter/Saida/create.js", 
      "~/Scripts/Globalize/globalize.js", 
      "~/Scripts/Globalize/Cultures/globalize.culture.pt-PT.js", 
      "~/Scripts/Common/date.js")); 

设置模型:

[Required(ErrorMessage = "Preenchimento obrigatório.")] 
[DataType(DataType.Date)] 
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd-MM-yyyy}")] 
[Display(Name = "Data da DAU")] 
public DateTime? DAUData { get; set; } 

我没有把任何的ErrorMessage中的数据类型属性,因为它没有传递到视图,相反,你可以在视图把自定义消息:

<div class="editor-field"> 
    @Html.EditorFor(model => model.DAUData) 
    @Html.ValidationMessageFor(model => model.DAUData, "Formato de data inválido.") 
</div> 

但是如果你使用jQuery的日期选择器功能与形式的定义,您不必担心格式:

$(function() 
{ 
    $(".datefield").datepicker({ dateFormat: 'dd-mm-yy', changeYear: true }); 
}); 

属性changeYear是为了选择年份(不是强制性的,只是一个很好的选项来保证该值始终有效),并且不要忘记在您的代码中包含jQuery和jQueryUI引用文件来正确呈现日历。

要完成客户端脚本,我有区域性的格式验证:

$.validator.methods.date = function (value, element) 
{ 
    return this.optional(element) || Globalize.parseDate(value, "dd-MM-yyyy", "pt-PT"); 
} 

我也有一个日期格式的模板在View(其放置在共享/ EditorTemplates /文件夹和Don”别忘了用户@ Html.EditorFor剃刀方法查看:

@{ 
    var value = ""; 

    if (Model.HasValue) 
    { 
     value = String.Format("{0:d}", Model.Value.ToString("dd-MM-yyyy")); 
    } 
} 

@Html.TextBox("", value, new { @class = "datefield", type = "text", autocomplete = "off"  }) 

现在,只要您将需要一个日期,使用模板,类“日期选择器”,这就是它

再次感谢丹斯;)

+0

很高兴你把它运行起来!全球化和格式化总是一个棘手的问题要解决:-D – DanS

+0

非常棘手! :D再次感谢;) – Patrick