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

egu*_*iar 5 model-view-controller model datetimepicker telerik-mvc telerik-grid

目前我有一个模型的 DateTime 属性。我正在使用 Telerik MVC 框架,但我使用的是 DateTime 属性,并且此属性的编辑器列是自动生成的,因此在我的视图或控制器中没有控制它的代码。在 Telerik 的网站上,有关于如何为日期时间选择器设置默认日期时间的说明,但此选择器并未在任何地方启动,因为它位于一列中。问题是我想将 DateTime 设置为当前日期和时间(如果尚未指定)。目前,模型的代码如下所示:

 public DateTime CreatedDate { get; set;}
Run Code Online (Sandbox Code Playgroud)

我希望它做更多这样的事情:

public DateTime CreatedDate
        {
            get
            {
                if (QuestionID != 0)
                {
                    return this.CreatedDate;
                }
                else
                {
                    return DateTime.Now;
                }

            }
            set { CreatedDate = value; }
        }
Run Code Online (Sandbox Code Playgroud)

这样,如果 ID 存在,它将返回为此问题存储的日期时间。如果您正在创建一个新问题,它将获取当前日期时间。

问题出在 Set 上。当我尝试加载屏幕时,将 get 设置为 Stack Overflow。我真的不熟悉这种代码,所以我不知道如何使用它。

之前我们不使用模型,而是使用 JQuery 获取 CreatedDate 的数据并将其设置为当前日期时间。问题是当您转到日期时间的“选择器”部分时,它会转到默认日期时间而不是当前日期时间。这就是为什么我想通过模型、视图或控制器而不是使用 Jquery 来设置它的原因。

如果您能帮助我理解模型中的 Gets 和 Sets,请告诉我!

Jus*_*ony 6

您需要拥有在幕后使用的私有财产。

    private DateTime _createdDate;
    public DateTime CreatedDate
    {
        get
        {
            if (QuestionID != 0)
            {
                return _createdDate;
            }
            else
            {
                return DateTime.Now;
            }

        }
        set { _createdDate = value; }
    }
Run Code Online (Sandbox Code Playgroud)

您正在溢出,因为您目前正在做这样的事情:

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)
Run Code Online (Sandbox Code Playgroud)

自动实现的属性 ( {get;set;}) 实际上在幕后使用了一个私有变量。如果您查看 IL,您会发现它实际上{get;set;}根据生成的私有变量将简单的方法分解为 getter/setter。它们只是一种“编译器魔法”,可以减少在 getter/setter 中没有真正逻辑时必须创建私有变量的样板代码。如果你有逻辑,那么你需要自己实现这个私有变量。