【问题标题】:ASP.NET MVC Bootstrap Datepicker Date Validation issueASP.NET MVC Bootstrap Datepicker 日期验证问题
【发布时间】:2015-08-11 14:36:58
【问题描述】:

我正在尝试让 Bootstrap Datepicker 工作。我按照以下来源的说明进行操作:

How to add Date Picker Bootstrap 3 on MVC 5 project using the Razor engine? (答案是Enzero)

&

http://bootstrap-datepicker.readthedocs.org/en/latest/options.html#format

问题是,我想使用德国格式 (dd.mm.yyyy),而不是常见的美国 mm/dd/yyyy 格式。所以我做了以下事情:

在模型中:

[Required]
[DataType(DataType.Date)]
[Display(Name = "Datum")]
[DisplayFormat(DataFormatString = "{0:dd.MM.yyyy}", ApplyFormatInEditMode = true)]
public DateTime? Day { get; set; }

在 Web.Config 中:

<system.web>
<globalization culture="de-DE" uiCulture="de-DE" />
...
</system.web>

在 Scripts\DatePickerReady.js 中:

if (!Modernizr.inputtypes.date) {
    $(function () {
        var date = new Date();
        date.setDate(date.getDate());
        $(".datecontrol").datepicker({
            startDate: date,
            format: 'dd.mm.yyyy'
        });
    });
}

结果是这样的:

这基本上就是我想要的。现在的问题是验证表明日期格式是错误的。 “字段基准必须是日期”

所以问题是,为什么验证不接受日期?

编辑#1:

我还使用 EditorTemplate 作为日期:(Views/Shared/EditorTemplates/date.cshtml):

@model Nullable<DateTime>

@{
    DateTime dt = DateTime.Now;

    if (Model != null)
    {
        dt = (System.DateTime) Model;
    }

    @Html.TextBox("", String.Format("{0:d}", dt.ToShortDateString()), new { @class = "form-control datecontrol", type = "date" })
}

编辑#2: 我刚刚读到,当您使用 TextBox(而不是例如 EditorFor)时,无法识别 DisplayFormat。这就解释了为什么验证不起作用。但是我还是不知道怎么解决。

编辑#3:

这是我在 IE F12 中看到的日期字段的 HTML 代码:

<input name="Day" class="form-control datecontrol input-validation-error" id="Day" aria-invalid="true" aria-required="true" aria-describedby="Day-error" type="date" value="11.08.2015" data-val-required="The Datum field is required." data-val="true" data-val-date="The field Datum must be a date.">

页面上加载的脚本有: jquery-2.1.4.js、bootstrap.js、bootstrap-datepicker.js、DatePickerReady.js、respond.js、jquery.validate.js、jquery.validate.unobtrusive.js

编辑#4: 我现在在 DatePickerReady.js 中使用它:

if (!Modernizr.inputtypes.date) {
    $(function () {
        var date = new Date();
        date.setDate(date.getDate());
        $(".datecontrol").datepicker({
            startDate: date,
            format: 'dd.mm.yyyy',
            autoclose: true,
            todayHighlight: true,
            weekStart: 1,
            language: 'de-DE',
            calendarWeeks: true
        });
    });
}

每个属性都有效,但“de-DE”似乎没有做任何事情。当时的语言仍然是英语。验证问题也仍然存在。

更多信息: ASP.NET MVC 5、.NET 4.6、Bootstrap.Datepicker 1.4.0、jQuery 2.1.4、jQuery.Validation 1.14.0、Microsoft.jQuery.Unobtrusive.Validation 3.2.3

【问题讨论】:

  • 您确定这与您的任何 javascript 中的验证无关吗?看看这个:link
  • 请在 f12 工具中使用网络选项卡检查这是客户端错误还是服务器错误
  • @branmar 我检查了链接并尝试实现它。虽然我加载了所有提到的脚本,但我得到了错误。我无法让它工作。
  • @MalcolmFrexner 当我使用日期选择器时,F12 中的网络选项卡没有说明任何错误。

标签: c# asp.net-mvc twitter-bootstrap


【解决方案1】:

当我想使用“dd MMM yyyy”作为日期格式并发现解决方案是编写我自己的 jQuery 验证器代码时,我遇到了类似的问题。

$(function () {
    try {
        $.validator.addMethod('date',
        function (value, element) {
            if (this.optional(element)) {
                return true;
            }
            var ok = true;
            try {
                ok = moment(value, "dd.mm.yyyy", true).isValid();   
            } catch (err) {
                ok = false;
            }
            return ok;
        });
    } catch (e) { }
});

注意 - 这使用 moment.js 进行验证,但由于引导程序 datetimepicker 需要它,所以这应该不是问题。更改格式以符合您的要求。

更新 - 抱歉,刚刚意识到我上传的原始代码中存在错误。我已经对其进行了编辑,现在应该可以使用了

【讨论】:

  • 你如何在页面上实现它?你省略 jqueryval 吗?
  • 我只是将它放在脚本部分的视图页面中,以便将其呈现到输出页面中。我没有在我的代码中使用 jqueryval 包,所以你应该可以省略它。
【解决方案2】:

我的配置: 型号:

[Required]
[Display(ResourceType = typeof(Resources.Data), Name = "FerretBirthDay")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd'/'MM'/'yyyy}")]
[DataType(DataType.Date)]
public DateTime BirthDate { get; set; }

查看:

@Html.TextBoxFor(m => m.BirthDate, "{0:dd.MM.yyyy}", new { @class = "form-control", id = "birthDate" })

$("#birthDate").datepicker();

我有 ru-RU 文化,但在日期格式上它等于 de-DE。突然,它起作用了。

【讨论】:

  • 感谢您的回答,但我刚刚读到当您使用 TextBox 时根本不使用 DisplayFormat。有关我使用的 EditorTemplate,请参阅我更新的帖子。这可以解释为什么使用 DisplayFormat 的验证不起作用。我也刚刚尝试了您的解决方案,但没有成功。如果 TextBox 不关心 DisplayFormat,这是合乎逻辑的。
  • @zuckerthoben 是的,我忘了这个,你需要使用 EditorFor。所以,我的解决方案是不使用 jQuery 中的 datepicker,使用 EditorFor 并显示我发布的格式
  • 那我会一直使用 HTML5 日期选择器,对吧?那么IE用户就无法使用了。这就是我想使用引导日期选择器的原因。它看起来也不错。
  • @zuckerthoben 是的,是的,你是对的。我真的忘记了这个,我今天晚上会探索我的项目,并尝试找到答案
  • 感谢您的参与。 @Backs
【解决方案3】:

我曾经遇到过类似的问题。我不得不改变我的 UI 文化(在 web.config 中),然后它开始正确验证。所以尝试这样的事情:

<configuration>
<system.web>
    <globalization uiCulture="de-DE" culture="de-DE" />
</system.web>

日期选择器端:

$('.datepicker').datepicker({
   language: "de-DE"
});

【讨论】:

  • 这就是我在帖子中所写的。为了更好地阅读,我删除了所有不必要的内容。
  • 对不起,我错过了。您是否还尝试在日期选择器本身上设置语言(请参阅我的编辑)
  • 我也试过了。日期选择器本身正在返回正确的格式,这似乎只是一个验证问题。查看我当前日期选择器代码的更新。
  • 我能想到的最后一件事:查看您的编辑器模板,在文本框值中,您似乎覆盖了您在模型中设置的显示格式。尝试将:String.Format("{0:d}", dt.ToShortDateString()) 更改为:dt.ToString(CultureInfo.GetCultureInfo("de-DE"))
  • 日期选择器提供的格式已经是准确的。而不是 CultureInfo.GetCultureInfo,我只是尝试了 dt.ToString("dd.MM.yyyy"),因为我不想要日期后面的时间。这样,日期选择器就会提供正确的格式,但他也做了预先更改。这只是对 datepicker 输出的验证。如果我知道怎么做,我会关闭该字段的验证,因为日期选择器将始终提供格式正确的日期,如果不是,我总是可以在控制器 POST 之后抛出错误。
【解决方案4】:

这是我的场景:

BundleConfig.cs:

bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                       "~/Scripts/jquery-{version}.js",
                       "~/Scripts/globalize.js",
                       "~/Scripts/globalize.culture.uk-UA.js"));

bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include(
                      "~/Scripts/bootstrap.js",
                      "~/Scripts/bootstrap-datepicker.js",
                      "~/Scripts/bootstrap-datepicker.uk.js",
                      "~/Scripts/respond.js"));

bundles.Add(new StyleBundle("~/Content/css").Include(
                      "~/Content/bootstrap.css",
                      "~/Content/datepicker.css",
                      ));

型号:

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")]
public DateTime? PaymentDate { get; set; }

查看:

<div class="input-group date">
    @Html.EditorFor(model => model.PaymentDate, new
    {
        htmlAttributes = new
        {
            @class = "form-control form-date",
        }
     )
     <span class="input-group-addon"><i class="glyphicon glyphicon-th"></i></span>
</div>

Js:

<script>
    (function($, Globalize) {

        // Clone original methods we want to call into
        var originalMethods = {
            min: $.validator.methods.min,
            max: $.validator.methods.max,
            range: $.validator.methods.range
        };

        // Tell the validator that we want numbers parsed using Globalize

        $.validator.methods.number = function(value, element) {
            var val = Globalize.parseFloat(value);
            return this.optional(element) || ($.isNumeric(val));
        };

        // Tell the validator that we want dates parsed using Globalize

        $.validator.methods.date = function(value, element) {
            var val = Globalize.parseDate(value);
            return this.optional(element) || (val);
        };

        // Tell the validator that we want numbers parsed using Globalize,
        // then call into original implementation with parsed value

        $.validator.methods.min = function(value, element, param) {
            var val = Globalize.parseFloat(value);
            return originalMethods.min.call(this, val, element, param);
        };

        $.validator.methods.max = function(value, element, param) {
            var val = Globalize.parseFloat(value);
            return originalMethods.max.call(this, val, element, param);
        };

        $.validator.methods.range = function(value, element, param) {
            var val = Globalize.parseFloat(value);
            return originalMethods.range.call(this, val, element, param);
        };

    }(jQuery, Globalize));


    $().ready(function() {

        var currentCulture = '@Thread.CurrentThread.CurrentUICulture.ToString()';
        Globalize.culture(currentCulture);

        $('.form-date').datepicker({
            language: '@Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName',
            todayBtn: "linked"
        });

    });
</script>

【讨论】:

  • 您好,谢谢您的回答。我会在以后看看这个!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-05
相关资源
最近更新 更多