如何更改模型属性的“获取”和“设置”?

时间:2012-03-26 17:12:27

标签: model-view-controller model telerik-grid telerik-mvc datetimepicker

目前我有一个模型的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。

如果您能帮我理解模型中的获取和设置,请告诉我!

1 个答案:

答案 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中没有真正逻辑时必须创建私有变量的样板代码。如果你有逻辑,那么你需要自己实现这个私有变量。