我想在我的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而不是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; }
但是通过这种方式日期选择器将不会被填充,因为日期选择器被定义为在日期类型的字段上填充,我想我错过了一些东西,在我理解事情的方式应该工作?
答案 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);
}