2012-11-27 13 views
5

ich wie ein Datumsformat bekam:Wie konfigurierbare Displayformat machen Attribut

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")] 
public DateTime? CreatedOn { get; set; } 

Nun, ich mag jedes Datums-Zeitformat in meiner Anwendung aus einer Config-Datei lesen machen. wie:

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = SomeClass.GetDateFormat())] 
public DateTime? CreatedOn { get; set; } 

aber das wird nicht kompilieren.

Wie kann ich das tun?

Antwort

7

Das Problem dabei ist, .NET können Sie nur Kompilierung-Konstanten in Attribute setzen. Eine weitere Option ist aus DisplayFormatAttribute und Lookup das Anzeigeformat im Konstruktor, wie so erben:

SomeClass.cs

public class SomeClass 
{ 
    public static string GetDateFormat() 
    { 
     // return date format here 
    } 
} 

DynamicDisplayFormatAttribute.cs

public class DynamicDisplayFormatAttribute : DisplayFormatAttribute 
{ 
    public DynamicDisplayFormatAttribute() 
    { 
     DataFormatString = SomeClass.GetDateFormat(); 
    } 
} 

Dann können Sie Verwenden Sie es so:

[DynamicDisplayFormat(ApplyFormatInEditMode = true)] 
public DateTime? CreatedOn { get; set; } 
0

Ich habe eine Zeichenkettenkonstante in einer Basisklasse erstellt und meine Sichtmodelle daraus abgeleitet, damit ich sie verwenden konnte.

Zum Beispiel:

public class BaseViewModel : IViewModel 
{ 
    internal const string DateFormat = "dd MMM yyyy"; 
} 

public class MyViewModel : BaseViewModel 
{ 
    [DisplayFormat(ApplyFormatInEditMode = true, 
        DataFormatString = "{0:" + DateFormat + "}")] 
    public DateTime? CreatedOn { get; set; } 
} 

So kann ich es auch mit Subklassifizieren verweisen konnte:

public class AnotherViewModel 
{ 
    [DisplayFormat(ApplyFormatInEditMode = true, 
        DataFormatString = "{0:" + BaseViewModel.DateFormat + "}")] 
    public DateTime? CreatedOn { get; set; } 
} 
Verwandte Themen