【问题标题】:Working with Datetime & date picker使用日期时间和日期选择器
【发布时间】:2014-06-12 12:11:54
【问题描述】:

我想在我的 asp.net mvc web 应用程序上测试数据纠察队。

1.所以我创建了以下测试模型:-

public class TestClass
    {
        [DataType(DataType.Date)]
        public DateTime D { get; set; }
    }

2.我添加了以下脚本:-

  $(function () {
    $(".datefield").datepicker();
});

3.在我看来,我有以下几点:-

@model MvcApplication6.Models.TestClass


@Html.EditorFor(item=>item.D)

现在日历会显示得很好,但是我有这两个问题:-

1.如果在操作方法中我指定数据时间等于今天日期如下:-

 public ActionResult Index()
            {
                TestClass t = new TestClass();
               t.D = DateTime.Now.Date;

                return View(t);
            }

然后日历会切换日期和月份,因此 6 月 12 日变为 12 月 6 日如下:-

2.如果我删除 dataitme 等于今天的日期,我将得到以下默认值:-

01/01/0001

3.如果我指定允许 null 的日期时间,并且我没有指定任何默认值,我将得到以下异常

[DataType(DataType.Date)]
        public DateTime? D { get; set; }

传入字典的模型项为空,但是这个字典 需要“System.DateTime”类型的非空模型项。

那么任何人都可以就导致这三个问题的原因提出建议吗? 谢谢

编辑 好的,我将我的属性更改为 String 而不是 date-time ,如下所示:-

[DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
        public string CreateDate { get; set; }

但这并没有解决数据验证问题,我仍然无法输入日期,例如 26/06/2014 ! 所以我尝试删除[DataType(DataType.Date)],所以我的财产变成:-

    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
    public string CreateDate { get; set; }

但是以这种方式不会填充日期选择器,因为日期选择器被定义为填充日期类型的字段,我想我错过了一些东西,在我对事情应该如何工作的理解中?

【问题讨论】:

  • 但如果我将日期选择器中的默认日期格式更改为 dd/mm,那么 .net Datetime 会将其读取为 mm/dd 吗?这是正确的吗?因为日期时间的默认格式是 mm/dd ?

标签: c# asp.net-mvc asp.net-mvc-5 jquery-ui-datepicker


【解决方案1】:

主要问题是本地化。 datepicker 小部件默认采用浏览器设置的本地化,我猜它设置为“美国英语”,日期格式为“MM/DD/YYYY”。 The documentation 指定小部件的默认日期格式为“mm/dd/yy”。请注意,jQuery DatePicker 的日期格式与 .Net Framework 使用的日期格式不同。更改构造函数:

$(function () {
    $(".datefield").datepicker({ dateFormat: "dd/mm/yy" });
});

然而,问题将转移到 jQuery Validation 插件上,它可能无法理解发生了什么。您可以编写自己的验证方法并覆盖默认的验证方法,或者使用字符串而不是实际日期来解决问题。


EDIT(解决您的编辑问题):
请查看此fidlle。我没有做任何特别的事情。只有一个 input 元素具有特定值“13/06/2014”(2014 年 6 月 13 日)。当您在输入中单击时,会弹出 jQuery Datepicker 并选择正确的日期。

您的模型中现在有一个string 属性。您不需要任何其他引用DateTime 对象的数据注释。 Razor 将为您的属性创建一个input 元素并在其中设置值。而已。您唯一需要做的就是转换从数据库加载的实际 DateTime 对象,具有适当的格式:

public ActionResult DisplayMyData()
{
    MyModelType model = new MyModelType();
    DateTime createDateDBObject = //get the date from your database

    model.CreateDate = createDateDBObject.ToString("dd/MM/yyyy");
    //or, for setting the current date
    //model.CreateDate = DateTime.Now.ToString("dd/MM/yyyy");

    return View(model);  
}

这个next fiddle 向您展示了如何将您的输入设为readonly。这意味着用户不能直接输入日期。他们必须改用 Datepicker。这反过来意味着您将始终将正确的日期格式(“dd/MM/yyyy”)返回给控制器。


编辑编号。 2(寻址模板) 我真的很高兴您为DateTime 创建了自己的模板。这就是我一直在做的事情,而且解决一个相对大的问题需要很少的努力。在我们(您)的情况下,这使事情变得更加简单。您需要做的是告诉 Razor 引擎使用您为 DateTime 对象编写的模板。为此,只需将DataType 属性添加到表示“字符串日期”的每个属性:

[DataType("your_template_name")]
public string CreateDate { get; set; }

另外,如果您在模板中设置了@model DateTime,请更改为@model string。如果您打算将类用作 jQuery ($(".datefield")) 的选择器,请确保您的模板在每个输入上都设置了类。

【讨论】:

  • 正确并找到答案 - 有趣的是,这正是我在各种项目和我的客户中所做的。
  • 不幸的是我也是这样:)
  • 在处理本地化时没有简单的方法,尤其是在使用不同的框架时,对日期有不同的“视图”。我建议您使用字符串而不是日期,使用您需要的格式配置datepicker,并在您的控制器内部,使用该格式将字符串解析为DateTime。此外,将input 设为只读;然后,您可以确保您始终拥有正确的格式(由datepicker 设置)。请记住,您知道格式并且可以使用它将“模型字符串”转换为 DateTime 对象。
  • @johnG,我开始认为您没有阅读我发布的内容,所以这将是我最后一次这样说:将您的财产类型从 @987654345 更改@到string。这将“停用”您属性上的日期的 jQuery Validator 方法。验证器会将属性视为字符串,并且不会为无效的日期格式争吵。请仔细阅读我的回答和cmets。
  • @johnG,如果您的日期验证是唯一的问题,就像我之前写的那样,请将您的输入字段设为readonly。您正在使用 jQuery Datepicker,因此您将始终拥有一个 valid 日期。如果用户不能直接编辑日期,而只能通过小部件来编辑,那么就没有什么可以验证的了。除非选择了日期,这可以通过在模型上使用 [Required] 属性来实现。
【解决方案2】:

1) 问题

原因:您的浏览器/JQUI 默认采用 dd/mm/yy 并且您正在传递 mm/dd/yy 格式。

因此出现了这个问题 解决方案

public ActionResult Index()
            {
                TestClass t = new TestClass();
               t.D = DateTime.Now.ToString("MM/dd/yyyy");

                return View(t);
            }

和@andri 一样

  $(".datefield").datepicker({ dateFormat: "dd/mm/yy" });

2)如果我删除 dataitme 等于今天的日期,我将得到以下默认值:

原因:您将日期时间作为数据类型。因此您不能分配任何值,那么默认情况下它将采用 01/01/0001

解决方案赋值,同1解决方案

3)因为你在那里给出了日期时间数据类型,因为它需要任何值作为日期时间格式

【讨论】:

    【解决方案3】:

    您可以将日期更改为操作结果中所需的格式,如下所示:

    public ActionResult Index()
                {     
    TestClass t = new TestClass();
                string dt = DateTime.Now.ToString("MM/dd/yyyy");
                t.D = DateTime.ParseExact(dt, "d/MM/yyyy", null, System.Globalization.DateTimeStyles.None);
                return View(t);
    }
    

    【讨论】:

      猜你喜欢
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-23
      相关资源
      最近更新 更多