joh*_* Gu 1 c# asp.net-mvc jquery-ui-datepicker asp.net-mvc-5
我想在我的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日如下: -

2.如果我将dataitme删除为等于今天的日期,我将获得以下默认值: -
01/01/0001
3.如果我指定datetime以允许null,并且我没有指定任何defualt值,我将得到以下异常
[DataType(DataType.Date)]
        public DateTime? D { get; set; }
传递到字典中的模型项为null,但此字典需要"System.DateTime"类型的非null模型项.
那么有人可以就导致这三个问题的原因提出建议吗?谢谢
编辑 确定我将我的属性更改为String而不是日期时间,如下所示: -
[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; }
但是这样日期选择器将不会被填充,因为日期选择器被定义为在日期类型的字段上填充,我想我错过了一些东西,在我理解事情的方式应该工作?
主要问题是本地化.该datepicker部件采用默认的本地化您的浏览器,这是我猜设置为"英语(美国)",并有日期格式为"MM/DD/YYYY"设置.该文档指定窗口小部件的默认日期格式为"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);  
}
这接下来的小提琴展示了如何让你的输入作为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"))的选择器,请确保您的模板在每个输入上设置类.