4

Derzeit habe ich eine DateTime-Eigenschaft für ein Modell. Ich benutze das Telerik MVC Framework, aber ich verwende eine DateTime-Eigenschaft und die Editor-Spalte für diese Eigenschaft ist automatisch generiert, so dass es keinen Code gibt, der es in meiner Ansicht oder Controller steuert. Auf der Telerik-Website finden Sie Anweisungen zum Festlegen der Standarddatumszeit für eine Datumszeitauswahl. Diese Auswahl wird jedoch nirgendwo initiiert, da sie sich in einer Spalte befindet. Das Problem ist, ich möchte die DateTime auf das aktuelle Datum und die Uhrzeit einstellen, wenn es nicht bereits angegeben ist. Derzeit sieht der Code für das Modell wie folgt aus:Wie kann ich "get" und "set" auf einer Model Property ändern?

public DateTime CreatedDate { get; set;} 

ich es etwas mehr wie dies tun wollen:

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

      } 
      set { CreatedDate = value; } 
     } 

auf diese Weise den Datetime zurückkehren wird, die für diese Frage, wenn die gespeicherte ist ID existiert. Wenn Sie eine neue Frage erstellen, wird die aktuelle DateTime abgerufen.

Das Problem ist hier mit dem Set. Wenn ich versuche, einen Bildschirm zu laden, setze get einen Stack Overflow. Ich bin mit dieser Art von Code wirklich nicht vertraut, also habe ich keine Ahnung, wie ich damit arbeiten soll.

Bevor wir nicht mit dem Modell arbeiten und stattdessen JQuery verwenden, um die CreatedDate-Daten abzurufen und auf die aktuelle Datumszeit zu setzen. Das Problem damit ist, wenn Sie zum "Picker" -Teil der Datumszeit gehen, es geht auf die Standard-Datumszeit anstatt der aktuellen Zeit. Aus diesem Grund möchte ich es über Model, View oder Controller und nicht über Jquery setzen.

Lassen Sie mich wissen, wenn Sie mir helfen können zu verstehen, Gets und Sets in dem Modell!

Antwort

4

Sie müssen eine private Eigenschaft haben, die Sie hinter den Kulissen verwenden.

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

     } 
     set { _createdDate = value; } 
    } 

Sie erhalten einen Überlauf, weil Sie so etwas wie dies derzeit tun:

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) 

Auto implementiert Eigenschaften ({get;set;}) tatsächlich eine private Variable hinter den Kulissen verwenden. Wenn Sie die IL betrachten würden, dann würden Sie sehen, dass es tatsächlich das einfache {get;set;} in einen Getter/Setter basierend auf einer generierten privaten Variable bricht. Sie sind nur eine Art "Compiler-Magie", um den Boiler-Plate-Code zu reduzieren, eine private Variable zu erzeugen, wenn es im Getter/Setter keine echte Logik gibt. Wenn Sie Logik haben, müssen Sie diese private Variable selbst implementieren.

+0

Vielen Dank Justin! Deine Lösung hat funktioniert. Ich habe bemerkt, dass die private Variable in anderen Bildschirmen verwendet wird, aber ich habe nicht verstanden, wie oder warum. Du hast es sehr gut erklärt. – egucciar

+0

Außerdem bin ich etwas neu in Programmierung und Debugging. Was ist der beste Weg, um die "interne Logik" eines laufenden Programms zu finden, damit ich sehen kann, was passiert? Im Moment mache ich nur Breakpoints und gehe durch das Programm. Würde ich in der Lage sein, durch die Logik des Get und Set zu treten? – egucciar