在foreach循环中使用Html.Display和Html.DisplayFor在Razor View中显示复合模型项

时间:2017-03-01 17:43:01

标签: c# asp.net-mvc razor foreach

我对此有点困惑。 我转移到View页面的ViewModel包含两个属性:

 public class UserProfileViewModel
{
    public ApplicationUser userProfile { get; set; }
    public AddressViewModel userAddress { get; set; }
}

AddressViewModel本身包含一个List,其项目我想要显示View Page:

public class AddressViewModel
{
    public int ID { get; set; }
    ......
    public virtual List<GeoData> GeoDataList { get; set; }
}

我在Wiew Page

上试试这个
@model MySite.ViewModels.UserProfileViewModel
...
@foreach (var item in Model.userAddress.GeoDataList)
        {
        <dd>
            @Html.DisplayFor(modelitem => item.PlaceName)
        </dd>
    }

我正确地得到了被删除的结果 但是当我试图显示我需要的复合结果时

@foreach (var item in Model.userAddress.GeoDataList)
        {
            <dd>
                @Html.DisplayFor(modelitem => (item.PlaceName + ", " + item.PostalCode + ", " + item.Latitude + ", " + item.Longitude))
            </dd>
        }

我得到以下异常:

Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.

当我尝试这个时:

@foreach (var item in Model.userAddress.GeoDataList)
        {
            <dd>
                @Html.Display(item.PlaceName + ", " + item.PostalCode + ", " + item.Latitude + ", " + item.Longitude)
            </dd>
        }

我没有例外,也没有任何结果(空白页)。

为什么?

2 个答案:

答案 0 :(得分:1)

你可以使用@Html.Raw显示没有任何html编码的结果

@foreach (var item in Model.userAddress.GeoDataList)
        {
            <dd>
                @Html.Raw(item.PlaceName + ", " + item.PostalCode + ", " + item.Latitude + ", " + item.Longitude)
            </dd>
        }

答案 1 :(得分:0)

您需要GeoData类的显示模板。显示模板是控制器文件夹或共享中DisplayTemplates子文件夹中名为GeoData.cshtml的局部视图。

您的GeoData.cshtml将类似于

@model MySite.ViewModels.GeoData
@Model.PlaceName, @Model.PostalCode, @Model.Latitude, @Model.Longitude

您的UserProfile页面代码如

<dd>
     @Html.DisplayFor(modelitem => item)
</dd>