2014-01-08 5 views
2

Я хочу добавить некоторые пользовательские атрибуты в свойство модели DateTime, сгенерированное с помощью @ Html.DisplayForModel, имеет ли MVC 4 что-то встроенное?Пользовательские атрибуты на модели

Просто пример

У меня есть класс модели

public class UserViewModel 
    { 
     [CustomAttribute(type = "DateTime")] 
     public DateTime DateStamp { get; set; } 
    } 

вид сборки, как этот

@model CA.Website.Models.UserViewModel 

@Html.DisplayForModel(Model) 

, и я хотел бы получить HTML визуализации как этот

<div class="display-label">Date Stamp</div> 
<div type="DateTime" class="display-field">1/8/2014 12:57:54 PM</div> 

ответ

0

Вы могли бы се UIHint на вашей модели таких областях, как это:

Модель:

public class UserViewModel 
{ 
    [UIHint("DateTimeField")] 
    public DateTime DateStamp { get; set; } 

} 

просмотров/DisplayTemplates DateTimeField.cshtml

@model DateTime 
<div class="display-label">Date Stamp</div> 
<div type="DateTime" class="display-field">@Model.ToString("dd/MM/yyyy HH:mm:ss tt")</div> 

Просмотр

@model UserViewModel 
@Html.DisplayFor(m => m.DateStamp) 

Update

В ответ на комментарий, чтобы заставить его работать, используя @Html.DisplayForModel изменить ваш взгляд на это:

@model MvcApplication3.Controllers.HomeController.UserViewModel 
@Html.DisplayForModel(Model.DateStamp) 

И ваш DisplayTemplate к этому:

@model DateTime 
<div type="DateTime" class="display-field">@Model.ToString("dd/MM/yyyy HH:mm:ss tt")</div> 
+0

Будет ли это работать и с @ Html.DisplayForModel? – Tomas

+0

Да, я добавлю обновление для того, что вам нужно сделать для этого. – hutchonoid

1

Вам не нужно атрибут сделать это можно сделать с помощью комбинации DisplayTemplate и библиотеки Humanizer.

Под вашей папкой Views/Shared добавьте новую папку под названием DisplayTemplates. Внутри создайте новый частичный вид - я предлагаю вам назвать его в соответствии с типом, который он отобразит, например. DateTime.cshtml.

В частичном, установите атрибут model на тип, который вы хотите отобразить, например.

@model DateTime 

Затем добавьте разметку, чтобы показать значение, например.

<div class="display-label">@Html.LabelForModel()</div> 
<div type="DateTime" class="display-field">@Model.ToString("dd/MM/yyyy HH:mm:ss")</div> 

Чтобы использовать парциальное из родительского вида, вы просто используете Html.DisplayFor, а инфраструктура MVC делает проводку для вас между типами, так что типы, которые имеют обычай DisplayTemplate использовать его и все остальное использует по умолчанию шаблоны.

Чтобы получить метку поля DateStamp в виде Date Stamp, у вас есть возможность использовать атрибут DisplayName (из System.ComponentModel), например.

public class UserViewModel 
    [DisplayName("Date Stamp") 
    public DateTime DateStamp 
... 

Но более сложный подход заключается в проверке модели являются обязательными против и тянуть имя свойства из метаданных, который использует MVC. Это происходит от имущества ViewData.ModelMetadata.PropertyName, которое получает нас DateStamp. Затем мы можем ввести Humanizer, который имеет метод расширения Humanize для строк, которые будут разделять строки PascalCased на отдельные слова, давая нам Date Stamp.

<div class="display-label">@Html.ViewData.ModelMetadata.PropertyName.Humanize(LetterCasing.Title)</div> 
Смежные вопросы