问题:我想用 globalize 显示德语格式的日期。使用 MVc 5 中提到的解决方案- 使用 unobtrusiv js 验证德国日期 - 一种适用于 IE 和 Firefox 的简单方法 - 没问题。
但谷歌浏览器使用输入类型“日期”并显示一个日期选择器。验证曾经失败过。
问题:我想用 globalize 显示德语格式的日期。使用 MVc 5 中提到的解决方案- 使用 unobtrusiv js 验证德国日期 - 一种适用于 IE 和 Firefox 的简单方法 - 没问题。
但谷歌浏览器使用输入类型“日期”并显示一个日期选择器。验证曾经失败过。
先前的答案可能会有所帮助,但是当您将其放在服务器上时,如果像我一样使用日期字段的信息进行进程计数,它将崩溃,因此,解决此问题并且没有未来问题的正确方法是由@RAVI VAGHELA 在这篇文章中
你需要修改你的Global.asax并添加下一个配置,记住它会重写你所有的日期格式,并且会忽略你在服务器上的所有内容,所以,要小心
protected void Application_BeginRequest(object sender, EventArgs e)
{
var newCulture = (CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone();
newCulture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";
newCulture.DateTimeFormat.DateSeparator = "-";
Thread.CurrentThread.CurrentCulture = newCulture;
}
注意:此方法已在 azure、(west 和 Europa)本地服务器(英语为 windows server 2012)和本地(windows 10 上为 iis express)测试,如果此方法在其他语言或地区有问题,请告知
在stackoverflow上阅读了很多答案后,我来到了这个解决方案:
在模型中,我引入了一个新的、未映射的属性:
...
[NotMapped]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime GeburtsdatumChromeEdit
{
get { return this.Geburtsdatum; }
set { this.Geburtsdatum = value; }
}
...
这是添加DisplayFormat
具有 Chrome 所需格式的数据注释所必需的。它将值通过管道传递给原始属性。
在视图中,我将日期的输入加倍,并用特殊类的 div 封装了两个组:
<div class="date4Normal">
@*Tut nicht in Chrome, da dieser dann einen Input vom Type "Date" verwendet und dieser verlangt dann ein Normdatum yyyy-mm-dd*@
@Html.EditorFor(model => model.Geburtsdatum)
@Html.ValidationMessageFor(m => m.Geburtsdatum, String.Empty, new {@class = "text-danger"})
</div>
<div class="date4Chrome">
@Html.EditorFor(model => model.GeburtsdatumChromeEdit)
@Html.ValidationMessageFor(m => m.GeburtsdatumChromeEdit, String.Empty, new { @class = "text-danger" })
@*@Html.TextBoxFor(model => model.Geburtsdatum, "{0:dd.MM.yyyy}")
@Html.ValidationMessageFor(m => m.Geburtsdatum, String.Empty, new { @class = "text-danger" })*@
</div>
使用我在 stackoverflow 上找到的函数(如何判断浏览器是否支持 <input type='date'>),我可以检测实际浏览器是否使用日期输入:
function checkDateInput() {
var input = document.createElement('input');
input.setAttribute('type', 'date');
var notADateValue = 'not-a-date';
input.setAttribute('value', notADateValue);
return (input.value !== notADateValue);
}
使用下一个功能,我删除了不需要的输入块:
function switchForChrome() {
var isChrome = checkDateInput();
if (isChrome) {
$('.date4Normal').remove();
} else {
$('.date4Chrome').remove();
}
};
在$(document).ready
我调用的函数中switchForChrome();
。
在这一点上它似乎工作,但日期的验证总是失败。
所以我添加了一些代码来解决(ASP.NET MVC 4 避免为 datetime 生成 data-val-date):
if (checkDateInput()) {
$.validator.addMethod('date',
function (value, element) {
return true;
});
}
最后它起作用了。对于显示,我使用原始属性 ( Geburtsdatum
),因此我获得了特定于语言的格式并用于编辑原始属性(IE、Firefox)或新属性GeburtsdatumChromeEdit
(Chrome、Opera)。