65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET/ASP.NET MVC 中使用 JQuery 日期选择器和日期时间选择器的最简单方法

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.90/5 (23投票s)

2016年10月5日

CPOL

6分钟阅读

viewsIcon

168030

downloadIcon

4590

这是在 ASP.NET/ASP.NET MVC 中使用 JQuery 日期选择器和日期时间选择器的最简单方法,并可根据您的需求进行大量自定义。

[更新消息]

起初,我只写了关于 jQuery 日期选择器的文章。但后来我意识到,有时我们还需要时间选择器,因此我修改了文章,并在日期选择器选项中添加了时间选择器选项。

引言

有时,我们需要让用户输入各种日期,例如出生日期、入职日期、接收日期、离职日期等。但是,为输入日期值渲染一个简单的文本框是一种糟糕的做法,因为日期格式存在问题。假设我这样做,那么一些用户将以 MM/dd/yyyy 格式输入日期,一些用户将以 dd-MMM-yyyy 格式输入,还有一些用户将以 yyyy/MM/dd 格式输入,等等。结果,整个事情将是一团糟。因此,最好为用户渲染一个日期选择器/日历来选择日期,这样可以为所有用户维护一个通用的日期格式。

开始吧

假设我们有一个 Employee 表单,我们将在此输入 employee 的信息。在 Employee 表单中,有一个名为“Joining Date”的字段,用于输入 EmployeeJoining Date。在这里,我们将使用 jQuery 日期选择器来输入 Joining Date 值。

步骤 1:我们的 model 类将如下所示

public class Employee
    {
        public int Id { get; set; }

        [Display(Name = "Employee Name")]
        public string EmployeeName { get; set; }

        [Display(Name = "Joining Date")]
        public DateTime JoiningDate { get; set; }
    }

步骤 2:首先,我们需要使用NuGet 包管理器在我们的项目中安装 JQueryUI 包,如下所示

步骤 3:现在将以下 CSS 和 JavaScript 文件链接添加到视图中。在这种情况下,它们是 Create.cshtmlEdit.cshtml。

<link href="~/Content/themes/base/jquery-ui.min.css" rel="stylesheet" />
<script src="~/Scripts/jquery-3.1.1.min.js"></script>
<script src="~/Scripts/jquery-ui-1.12.1.min.js"></script>

步骤 4:现在向渲染 JoiningDate 值输入字段的 editor HTML(不是 Model 类!)添加一个类(html 类属性)或 id 名称。在这种情况下,我在这里添加了一个类属性,它看起来如下

@Html.EditorFor(model => model.JoiningDate, 
new { htmlAttributes = new { @class = "form-control date-picker" } })

步骤 5:现在调用 JQuery datepicker() 函数,该函数将在用户单击 Joining Date 输入字段时调用。它应该看起来如下

<script src="~/Scripts/jquery-3.1.1.min.js"></script>
    <script src="~/Scripts/jquery-ui-1.12.1.min.js"></script>
    <script type="text/javascript">
        $(function () {
            $(".date-picker").datepicker({
                dateFormat: 'dd-M-yy' 
            });

        });

    </script>

这将以“19-Apr-2017”格式接受输入。如果您希望它为“19/04/2017”,则使用“dd/mm/yy”而不是“dd-M-yy”。有关在 jquery 日期选择器中格式化输入日期的更多详细信息:https://jqueryui-api.jqueryjs.cn/datepicker/#option-dateFormat

现在运行项目以创建新的 Employee 记录。每当您单击 Joining Date 输入字段来输入 Joining Date 值时,它都会显示一个 JQuery 日期选择器/日历来选择日期,如下所示

创建了员工名为 Mark 的记录后,其显示如下

如果您想编辑/更新 Mark 记录的 Joining Date,它会如下显示

虽然它工作正常,但日期格式存在一个小问题。日期显示了不必要的时间值。不应该显示。为了删除不必要的时间值并正确格式化日期,我们必须使用 Data Annotation,如下所示

    [Display(Name = "Joining Date")]
    [DisplayFormat(DataFormatString = "{0:dd-MMM-yyyy}", ApplyFormatInEditMode = true)]
    public DateTime JoiningDate { get; set; }

现在运行项目,查看日期格式已更改,并且在显示和编辑字段中都显示为不带不必要时间值的日期,如下所示

此外,为了突出显示编辑字段中 Joining Date 的现有值,请在 @Html.EditorFor() 帮助器方法中重写,如下所示

@Html.EditorFor(model => model.JoiningDate, new { htmlAttributes = new { Value = Model.JoiningDate.ToString("dd-MMM-yyyy"), @class = "form-control date-picker"} })

现在它显示如下,并将现有的 Joining Date 以蓝色突出显示

到目前为止,这非常好。但请记住,虽然我们提供了一个日历供用户选择日期,但用户仍然可以通过不从日历中选择来在日期输入字段中输入值,这不应该被允许。用户应该只允许从日历中选择日期值,以保持日期格式的完整性。

为了防止用户在 Joining Date 输入字段中输入或粘贴任何内容,请在 @Html.EditorFor() 帮助器方法中添加一些 HTML 属性,代码将如下所示

@Html.EditorFor(model => model.JoiningDate, new { htmlAttributes = new { Value = Model.JoiningDate.ToString("dd-MMM-yyyy"), @class = "form-control date-picker", onkeydown = "return false", onpaste = "return false" } })

现在用户将无法在 Joining Date 的输入字段中键入或粘贴任何内容,而是必须从日期选择器/日历中选择 Date 值。

虽然一切正常,但我们的 JQuery 日期选择器/日历存在一个小的灵活性问题。假设用户需要选择 10 年或 15 年前的日期,那么他/她必须通过单击日期选择器/日历标题上的后退按钮逐月后退。现在想想,如果她/他要选择 10 年前的日期,那么她/他必须单击后退按钮 12*10 = 120 次。

因此,日期选择器/日历标题应该有一个月份下拉菜单和一个年份下拉菜单,用户可以从中选择日期选择器/日历中显示的任何年份和月份。为此,我们必须在 datepicker() 函数中添加一些自定义选项,如下所示

<script src="~/Scripts/jquery-3.1.1.min.js"></script>

<script src="~/Scripts/jquery-ui-1.12.1.min.js"></script>
    <script type="text/javascript">
        $(function () {
            $(".date-picker").datepicker({
                changeMonth: true,
                changeYear: true,
                yearRange: "-100:+0", // You can set the year range as per as your need
                dateFormat: 'dd-M-yy'
            });
        });
    </script>

现在运行项目,在创建新的 Employee 记录或更新任何现有记录时,单击 Joining Date 属性的输入字段。您现在可以看到,您可以轻松地从过去 100 年中选择任何日期,如下所示

Google Chrome 和 jquery.validate.js 问题!!

有时 Google Chrome 会出现异常!它会抛出验证错误消息“字段日期必须是日期”,即使输入值是正确格式的日期。根据一些 StackOverFlow 的问答,这是 jquery.validate.js 的一个 bug。要修复此问题,需要编写一些 JavaScript 代码,如下所示

<script src="~/Scripts/jquery-3.1.1.min.js"></script>

<script src="~/Scripts/jquery-ui-1.12.1.min.js"></script>

<script type="text/javascript">
        $(document).ready(function () {
            $(function () {
                $(".date-picker").datetimepicker({
                    changeMonth: true,
                    changeYear: true,
                    yearRange: "-100:+0",
                    dateFormat: 'dd-M-yy'
                });

            });

            jQuery.validator.methods.date = function (value, element) {
                var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
                if (isChrome) {
                    var d = new Date();
                    return this.optional(element) || !/Invalid|NaN/.test(new Date(d.toLocaleDateString(value)));
                } else {
                    return this.optional(element) || !/Invalid|NaN/.test(new Date(value));
                }
            };

        });

    </script>

这就是 JQuery 日期选择器的全部内容!!

现在添加 Jquery 时间选择器以及 JQuery 日期选择器

将 Jquery 时间选择器与现有的日期选择器一起添加非常有趣!实现起来非常简单。

步骤 1:在项目中,使用NuGet 包管理器安装Jquery 时间选择器插件包,如下所示

步骤 2:现在将以下 CSS 和 JavaScript 文件链接添加到视图中。在这种情况下,视图是Create.cshtmlEdit.cshtml。

<link href="~/Content/jquery-ui-timepicker-addon.min.css" rel="stylesheet" />

<script src="~/Scripts/jquery-ui-timepicker-addon.min.js"></script>

步骤 3:将 datepicker() 函数名更改为 datetimepicker() 并添加一些选项,如下所示

<script src="~/Scripts/jquery-ui-1.12.1.min.js"></script>
    <script src="~/Scripts/jquery-ui-timepicker-addon.min.js"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            $(function () {
                $(".date-picker").datetimepicker({
                    changeMonth: true,
                    changeYear: true,
                    yearRange: "-100:+0",
                    dateFormat: 'dd-M-yy',
                    controlType: 'select',
                    timeFormat: 'hh:mm TT'
                });

            });

            jQuery.validator.methods.date = function (value, element) {
                var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
                if (isChrome) {
                    var d = new Date();
                    return this.optional(element) || !/Invalid|NaN/.test(new Date(d.toLocaleDateString(value)));
                } else {
                    return this.optional(element) || !/Invalid|NaN/.test(new Date(value));
                }
            };

        });

    </script>

完成!现在运行项目以创建新的 Employee 记录。每当您单击 Joining Date 输入字段来输入 Joining Date 和 Time 值时,它都会显示一个 JQueryDateTimePicker 来选择日期和时间,如下所示

步骤 4:现在,为了显示时间以及日期,请修改 Employee Model 类中的 [DisplayFormat()] 数据注解,如下所示

[DisplayFormat(DataFormatString = "{0:dd-MMM-yyyy hh:mm tt}", ApplyFormatInEditMode = true)]
public DateTime JoiningDate { get; set; }

创建员工名为 Mayanti 的记录后,其显示如下

如果您想编辑/更新 Mayanti 记录的 Joining Date,它会如下显示

这就是 JQuery 日期选择器和 JQuery 日期时间选择器的全部内容!!

结论

您还可以根据自己的需求进一步自定义 JQuery 日期选择器和 JQuery 日期时间选择器,以获得 JQuery UI 和 JQuery 日期时间选择器官方网站的帮助。

如果您有任何建议或疑问,请不要忘记评论。此外,如果您从中受益,我们请求您分享。谢谢!!

建议:下载源代码将有助于更轻松地理解本文。

© . All rights reserved.