使用Datetime&日期选择器

时间:2014-06-12 12:11:54

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

我想在我的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.如果在action方法中,我将数据时间指定为今天的日期,如下所示: -

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

                return View(t);
            }

然后压延机将切换日期&月,所以6月12日成为12月6日如下: - enter image description here

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

01/01/0001

3.如果我指定datetime以允许null,并且我没有指定任何defualt值,我将得到以下异常

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

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

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

修改 好的,我将我的属性更改为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; }

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

3 个答案:

答案 0 :(得分:5)

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

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

然而问题将转移到jQuery Validation插件,这可能无法理解正在发生的事情。您可以通过编写自己的验证方法并覆盖默认方法,或使用字符串而不是实际日期来解决问题。


编辑(解决您的编辑问题):
请查看此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"))的选择器,请确保您的模板在每个输入上设置类。

答案 1 :(得分:1)

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)原因你给出日期时间数据类型,因为它需要任何值作为日期时间格式

答案 2 :(得分:0)

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

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);
}