如何在MVC中为用户定义的类更改Html.DisplayFor的格式

时间:2017-06-06 14:10:32

标签: c# asp.net-mvc razor

我的主要模型Project有一个叫做“ProjectAddress”的属性,它的类型是“Address” - 我定义的一个类。地址具有属性Line1,Line2,City,State和ZipCode。当我使用@Html.DisplayFor(model => model.ProjectAddress)时,它显示为:

Line 1
<Line1 value here>
Line 2
<Line2 value here>
City
<City value here>
...

等等。我希望它显示为:

<Line 1>
<Line 2 if defined>
<City>, <State>, <ZipCode>
<County> County

没有每个值上方的属性标题。每次我想通过硬编码显示地址时,我都可以手动执行此操作

@Html.DisplayFor(model => model.ProjectAddress.Line1)
@if (!String.IsEmptyOrNull(model.ProjectAddress.Line2))
{
    @Html.DisplayFor(model => model.ProjectAddress.Line2)
}
@Html.DisplayFor(model => model.ProjectAddress.City), @Html.DisplayFor(model => model.ProjectAddress.State), @Html.DisplayFor(model => model.ProjectAddress.ZipCode)

但是这非常繁琐,如果我因为某种原因改变地址类的格式,我将不得不浏览我的代码并更改其中的每个实例。有没有办法可以将@Html.DisplayFor(model => model.ProjectAddress)的格式更改为上面的代码块?

2 个答案:

答案 0 :(得分:2)

您需要添加自定义显示模板。添加文件Views\Shared\DisplayTemplates\Address.cshtml,并将以下代码放入:

@model Namespace.To.Address
@Html.DisplayFor(m => m.Line1)
@if (!String.IsEmptyOrNull(Model.Line2))
{
    @Html.DisplayFor(m => m.Line2)
}
@Html.DisplayFor(m => m.City), @Html.DisplayFor(m => m.State), 
@Html.DisplayFor(m => m.ZipCode)

然后,您可以在视图中尝试使用DisplayFor

@Html.DisplayFor(m => m.ProjectAddress)

Razor将使用您定义的模板来呈现ProjectAddress实例。

答案 1 :(得分:1)

查看名为“显示模板”的内容。缺点是这个..

  1. 您在views/shared下创建一个名为&#39; DisplayTemplates`的新文件夹(您也可以使用编辑器模板。
  2. 添加一个名为Address.cshtml的新cshtml文件。将其模型设置为My.LongNamespace.Address
  3. 添加您要使用的代码,以便标记&#39;地址类型。
  4. 示例Address.cshtml(未经测试)

    @model My.LongNamespace.Address
    
    @Html.DisplayFor(model => model.Line1)
    @if (!String.IsEmptyOrNull(model.Line2))
    {
        @Html.DisplayFor(model => model.Line2)
    }
    @Html.DisplayFor(model => model.City), 
    @Html.DisplayFor(model => model.State), 
    @Html.DisplayFor(model => model.ZipCode)