Как я могу изменить «получить» и «установить» на свойство модели? - PullRequest
4 голосов
/ 26 марта 2012

В настоящее время у меня есть свойство DateTime для модели.Я использую каркас Telerik MVC, но я использую свойство DateTime, и столбец редактора для этого свойства генерируется автоматически, поэтому в моем представлении или контроллере отсутствует код, управляющий им.На веб-сайте Telerik есть инструкции о том, как установить время по умолчанию для средства выбора времени, но оно нигде не инициируется, потому что оно находится в столбце.Проблема в том, что я хочу установить DateTime в качестве текущей даты и времени, если оно еще не указано.В настоящее время код для модели выглядит следующим образом:

 public DateTime CreatedDate { get; set;}

Я хочу, чтобы он сделал что-то более похожее на это:

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

            }
            set { CreatedDate = value; }
        }

, таким образом он вернет DateTime, сохраненный дляэтот вопрос, если идентификатор существует.Если вы создаете новый Вопрос, он получает текущий DateTime.

Проблема здесь с Set.Когда я пытаюсь загрузить экран, устанавливаю get - переполнение стека.Я действительно не в восторге от такого рода кода, поэтому понятия не имею, как с ним работать.

До того, как мы не работали с моделью, вместо этого я использовал JQuery, чтобы получить данные CreatedDate и установить для них значениетекущая дата и времяПроблема с этим заключается в том, что когда вы переходите к части выбора времени «выбора», она переходит к времени даты по умолчанию, а не к текущему.Вот почему я хочу установить его через Модель, Представление или Контроллер, а не с помощью Jquery.

Дайте мне знать, если вы можете помочь мне понять Gets и Sets в модели!

1 Ответ

4 голосов
/ 26 марта 2012

Вам нужно иметь частную собственность, которую вы используете за кулисами.

    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 нет реальной логики.Если у вас есть логика, вам нужно реализовать эту приватную переменную самостоятельно.

...