【问题标题】:Validation failing because of date format由于日期格式,验证失败
【发布时间】:2018-03-28 23:58:22
【问题描述】:

我有一个包含出生日期字段的 MVC6 编辑视图,如下所示:

<div class="form-group">
    @Html.LabelFor(model => model.DateOfBirth, htmlAttributes: new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @*@Html.EditorFor(model => model.DateOfBirth, new { htmlAttributes = new { @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.DateOfBirth, "", new { @class = "text-danger" })*@
        @Html.EditorFor(m => m.DateOfBirth,new { htmlAttributes = new { @readonly = "readonly" } })
        @Html.ValidationMessageFor(model => model.DateOfBirth, "", new { @class = "text-danger" })
    </div>
</div>

因此,当我单击“保存”时,错误提示:“07/17/1981”值对 ApplicationDate 无效。如何确保日期以英国格式显示,这意味着验证成功。

我在 Bubdle.Config 中添加了以下答案:

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

【问题讨论】:

  • 您是在客户端还是在服务器端收到此错误?
  • “我已尝试将此添加到 en-gb 到”... 到什么?
  • 请阅读How to Ask 并分享您的研究。许多现有问题都涉及到这个确切的问题。
  • @Codecaster,该字段是只读的(如代码所示)。您的链接建议使用 DatePicker 并没有帮助。
  • @Scrobi,我知道仅显示会解决它。我只是很感兴趣。

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


【解决方案1】:

像这样更新你的模型:

// Add this attribute
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] 
public  DateTime DateOfBirth { get; set; }

【讨论】:

  • 这完全没有任何区别。
  • 为什么我必须为此使用 JQuery?
  • 在模型中添加属性应该可以。在您的剃刀语法中,使用 dd/mm/yyyy 将日期转换为字符串格式,如下所示:@Html.EditorFor(model => model.DateOfBirth.value.ToString("dd.MM.yyyy"), new { htmlAttributes = new { @class= "表单控件" } })
  • 我会尽快尝试。我真的不认为这会那么简单,因为这里有很多案例表明需要 globalize 插件。如果你所要做的就是你所说的,为什么所有这些人都有问题?
【解决方案2】:

我假设您的错误是客户端的?即不显眼的验证? 已经发布的替代解决方案是使用全球化。

有一个可用的 Nuget 包“jQuery.Validation.Globalize。您可以安装它并简单地将 globalize Javascript 文件包含在您的 jqueryval 包中。

您可以通过导航到App_Start 目录并编辑BundleConfig.cs 文件来执行此操作。 你会看到bundles/jqueryval 应该已经有一个ScriptBundle - 您可以将globalize.jsjquery.val.globalize.js 文件的路径添加到其中,或者创建一个单独的ScriptBundle 以在您的视图中引用。

注意:这仅在您将CultureInfo 添加到您的 Global.asax 文件时才有效,如下所示。

您还需要将以下内容添加到您的 Global.asax 文件中。

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");

【讨论】:

  • 这完全没有任何区别。
  • 您是否安装了 Globaliza Nuget 包并将 JavaScript 文件包含到您的页面中?我昨天遇到了和这个完全相同的问题,Globalize 为我解决了这个问题。
  • 肯定有办法避免使用 JQuery 吗?我只想以某种格式显示日期(它不可编辑)。
  • 这取决于您的设置。此问题的常见原因是使用了 Jquery 的不显眼验证。在这种情况下,全球化一揽子计划将解决该问题。错误在于客户端验证,而不是后端。您还可以通过覆盖不显眼验证中的日期属性来绕过它
  • 我如何:“将全球化 Javascript 文件包含在您的 jqueryval 包中”。谢谢。
【解决方案3】:

在导演Views/Shared/EditorTemplates我加了一个观点UKDate

我的特定视图的代码是:

@model DateTime?

@{
    if (Model.HasValue)
    {
        var classname = ViewData["class"];
        var id = ViewData["id"];

        <input type="text"
               name="@ViewData.TemplateInfo.HtmlFieldPrefix" //this needed to map the input to the property in your model, by the default model binder.
               value="@Model.Value.ToString("dd/MM/yyyy")" 
               class="@classname"
               id="@id"
            />
    }
}

然后要使用它,我执行以下操作:

@Html.EditorFor(x => x.YourDateFieldDate, "UKDate", new { @class = "any css classes required here", id = "Id here" })

由于现在没有data-val-date 属性,因此不会运行验证。因此,如果您不关心任何客户端日期验证,这可以解决问题。

【讨论】:

  • 你为什么不使用 Globalize 插件?这里有很多关于它的问题和答案。我都试过了,没有任何效果。
  • 我试过这个answer,但它对我不起作用。查看 Globalize 存储库,虽然这个答案看起来可能适用于旧版本。
  • 没有任何文档解释如何解决这个非常关键的问题,这真的很糟糕。
【解决方案4】:

查看此页面上的示例,检查它是否符合您的要求。

https://johnnyreilly.github.io/jQuery.Validation.Unobtrusive.Native/AdvancedDemo/Globalize.html

我看到你问为什么需要包含 jquery,答案是因为 microsoft 验证由于 jquery 而发生,它们一起工作来实现这一点。

如果您的页面是英语 en-US,则默认验证将起作用,但如果您的文化与我的不同,您至少需要包含该页面中提到的内容(基本上是 jquery、全球化和验证)。

Globalize 将覆盖 Validation 以在您想要的文化中工作。

试一试,然后告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    相关资源
    最近更新 更多