【问题标题】:Custom attributes on model模型上的自定义属性
【发布时间】:2014-01-09 02:58:51
【问题描述】:

我想为@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>

【问题讨论】:

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


    【解决方案1】:

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

    在您的 Views/Shared 文件夹下,添加一个名为 DisplayTemplates 的新文件夹。在其中创建一个新的局部视图 - 我建议您根据它将显示的类型命名它,例如日期时间.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>
    

    【讨论】:

      【解决方案2】:

      您可以像这样在模型字段上使用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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-07
        相关资源
        最近更新 更多