目前我有一个模型的DateTime属性。我正在使用telerik MVC框架,但我使用的是DateTime属性,并且该属性的编辑器列是自动生成的,因此没有代码可以在我的View或Controller中控制它。在Telerik的网站上有关于如何设置日期时间选择器的默认日期时间的说明,但是此选择器不会在任何地方启动,因为它位于列中。问题是我想将DateTime设置为当前日期和时间(如果尚未指定)。目前,该模型的代码如下所示:
public DateTime CreatedDate { get; set;}
我希望它能做更像这样的事情:
public DateTime CreatedDate
{
get
{
if (QuestionID != 0)
{
return this.CreatedDate;
}
else
{
return DateTime.Now;
}
}
set { CreatedDate = value; }
}
这样,如果ID存在,它将返回为此Question存储的DateTime。如果您要创建一个新问题,它将获取当前的DateTime。
问题在于Set。当我尝试加载屏幕时,将get设置为Stack Overflow。我对这种代码非常不熟练,所以我不知道如何使用它。
在我们不使用模型之前,而是使用JQuery获取CreatedDate的数据并将其设置为当前日期时间。问题是当你转到日期时间的“选择器”部分时,它会转到默认日期时间而不是当前时间。这就是为什么我想通过Model,View或Controller设置它,而不是使用Jquery。
如果您能帮我理解模型中的获取和设置,请告诉我!
答案 0 :(得分:4)
您需要拥有一个在幕后使用的私有财产。
private DateTime _createdDate;
public DateTime CreatedDate
{
get
{
if (QuestionID != 0)
{
return _createdDate;
}
else
{
return DateTime.Now;
}
}
set { _createdDate = value; }
}
你正在获得溢出,因为你现在正在做这样的事情:
CreatedDate = 1/1/2012;
...which then calls
CreatedDate = 1/1/2012;
...which then calls
CreatedDate = 1/1/2012
..You get the point (it is continuously setting itself until the stack overflows)
自动实现的属性({get;set;}
)实际上在后台使用私有变量。如果您要查看IL,那么您会看到它实际上将基于生成的私有变量的简单{get;set;}
分解为getter / setter。它们只是一种“编译器魔术”,可以减少在getter / setter中没有真正逻辑时必须创建私有变量的样板代码。如果你有逻辑,那么你需要自己实现这个私有变量。