Как сделать настраиваемый атрибут DisplayFormat
Я получил формат даты как:
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
public DateTime? CreatedOn { get; set; }
Теперь я хочу, чтобы каждый формат даты и времени в моем приложении читался из одного файла конфигурации. лайк:
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = SomeClass.GetDateFormat())]
public DateTime? CreatedOn { get; set; }
но это не скомпилируется.
Как я могу это сделать?
2 ответа
Решение
Проблема в том, что.NET позволяет вам только помещать константы времени компиляции в атрибуты. Другой вариант - наследовать от DisplayFormatAttribute
и ищите формат отображения в конструкторе, вот так:
SomeClass.cs
public class SomeClass
{
public static string GetDateFormat()
{
// return date format here
}
}
DynamicDisplayFormatAttribute.cs
public class DynamicDisplayFormatAttribute : DisplayFormatAttribute
{
public DynamicDisplayFormatAttribute()
{
DataFormatString = SomeClass.GetDateFormat();
}
}
Тогда вы можете использовать это так:
[DynamicDisplayFormat(ApplyFormatInEditMode = true)]
public DateTime? CreatedOn { get; set; }
Я создал строковую константу в базовом классе и разделил ее на подклассы, чтобы я мог использовать ее.
Например:
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; }
}
Таким образом, я мог бы также сослаться на это с помощью подклассов:
public class AnotherViewModel
{
[DisplayFormat(ApplyFormatInEditMode = true,
DataFormatString = "{0:" + BaseViewModel.DateFormat + "}")]
public DateTime? CreatedOn { get; set; }
}