模型上的自定义属性

时间:2014-01-08 14:07:33

标签: c# asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我想为@ Html.DisplayForModel生成的DateTime模型属性添加一些自定义属性,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>

2 个答案:

答案 0 :(得分:1)

您不需要使用属性来执行此操作,您可以使用DisplayTemplate和Humanizer库的组合来执行此操作。

Views/Shared文件夹下,添加名为DisplayTemplates的新文件夹。在其中,创建一个新的局部视图 - 我建议你根据它将显示的类型命名它,例如DateTime.cshtml。

在partial中,将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>

要使用父视图中的partial,只需使用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>

答案 1 :(得分:0)

您可以在模型字段中使用UIHint,如下所示:

型号:

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

}

观看/展示模板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)

<强>更新

在回答评论时,要使用@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>