0

问题:我想用 globalize 显示德语格式的日期。使用 MVc 5 中提到的解决方案- 使用 unobtrusiv js 验证德国日期 - 一种适用于 IE 和 Firefox 的简单方法 - 没问题。

但谷歌浏览器使用输入类型“日期”并显示一个日期选择器。验证曾经失败过。

4

2 回答 2

0

先前的答案可能会有所帮助,但是当您将其放在服务器上时,如果像我一样使用日期字段的信息进行进程计数,它将崩溃,因此,解决此问题并且没有未来问题的正确方法是由@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)测试,如果此方法在其他语言或地区有问题,请告知

于 2017-07-13T13:41:23.420 回答
0

在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)。

于 2017-07-06T09:43:01.580 回答