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