2012-04-06 7 views
1

Ich erstelle ein Modell für Benutzer, und ich möchte, dass Eigenschaft Join auf Now() festgelegt wurde. Hier ist mein Code:Aktuelles Datum einer Eigenschaft in MVC zuweisen

[DefaultValue(DateTime.Now)] 
public DateTime joined {get; set;} 

ich Fehler:

An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type.

Was mache ich falsch? Und was ist der beste Weg zu tun, was ich will?

Antwort

7

DateTime.Now ist keine Konstante, sondern eine Eigenschaft, die zur Laufzeit berechnet ist, weshalb Sie können nicht tun, was Sie vorschlagen.

können Sie tun, was Sie vorschlagen entweder mit:

public class MyClass { 
    public DateTime joined { get; set; } 
    public MyClass() { 
    joined = DateTime.Now; 
    } 
} 

Oder:

public class MyClass { 
    private DateTime _joined = DateTime.Now; 
    public DateTime joined { get { return _joined; } set { _joined = value; } } 
} 
1

Sie könnten versuchen, diese Klasse in Ihrem Modell:

private DateTime _joined = DateTime.Now; 
public DateTime Joined 
{ 
    get { return _joined; } 
    set { _joined = value; } 
} 
1

Sie keine Ausdrücke auf den Standardwert Attribut festlegen. Da Datenannotationen keine Laufzeitattribute sind. Sie sollten Standardwert wie folgt

private DateTime _joined = DateTime.Now; 
public DateTime Joined 
{ 
    get { 
     return _joined; 
    } 
    set { 
     _joined = value; 
    } 
} 
1

Sie tun können, es wie das, was die anderen vorschlagen, aber eine andere Alternative ist es in Ihrem Aktionsmethode zu setzen, nach der Zuordnung von View-Modell zu Domäne und kurz bevor es das Hinzufügen auf die Datenbank (wenn dies ist, was Sie tun müssen):

[HttpPost] 
public ActionResult Create(YourViewModel viewModel) 
{ 
    // Check if view model is not null and handle it if it is null 

    // Do mapping from view model to domain model 
    User user = ... // Mapping 
    user.DateJoined = DateTime.Now; 

    // Do whatever else you need to do 
} 

Ihr domail Modell für Benutzer:

public class User 
{ 
    // Other properties here 

    public DateTime DateJoined { get; set; } 
} 

ich es in der Aktion-Methode, weil das Datum festgelegt haben persönlich würde und Die Zeit wäre näher, wenn der Benutzer tatsächlich zur Datenbank hinzugefügt wird (vorausgesetzt, Sie wollten dies tun). Lassen Sie uns sagen, Sie erstellen Ihr Benutzerobjekt um 12:00 Uhr, dann ist dies Ihre Zeit, wenn der Benutzer der Datenbank hinzugefügt wird, aber was passiert, wenn Sie nur um 12:30 Uhr auf die Senden-Schaltfläche klicken? Ich würde lieber 12:30 als 12:00 bevorzugen.

+0

Ich stimme zu, das ist die bessere Lösung, ein Benutzer kann eine Ansicht öffnen und die DateTime würde gesetzt werden, aber wenn sie diese Ansicht für eine lange Zeit abhängig von Ihrer Cache-Strategie verlassen, kann es inkonsistent sein. Ich persönlich verwende ein DTO der Basisklasse, zu dem alle DTOs gehören, die die Eigenschaften CreatedBy, CreatedDate, LastUpdatedBy, LastUpdatedDate enthalten. Diese werden gesetzt, bevor sie in der Datenbank gespeichert werden –