C# ASP.net在Html.DisplayFor之后添加文本

C# ASP.net在Html.DisplayFor之后添加文本,c#,html,asp.net,asp.net-mvc,C#,Html,Asp.net,Asp.net Mvc,我试图在ASP.net MVC 5视图中的@Html.DisplayFor()帮助程序之后添加一些文本,但无法使其正常工作 我的代码: @foreach (var item in Model.Changes) { <tr> <td> @Html.DisplayFor(modelItem => item.Name) </td> <td> @H

我试图在ASP.net MVC 5视图中的@Html.DisplayFor()帮助程序之后添加一些文本,但无法使其正常工作

我的代码:

@foreach (var item in Model.Changes)
{
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Value)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Date)
        </td>
        <td>
            @foreach (var tag in item.Tags)
            {
                @Html.DisplayFor(modelItem => tag.Name)
            }
        </td>

    </tr>
    }
@foreach(Model.Changes中的变量项)
{
@DisplayFor(modelItem=>item.Name)
@DisplayFor(modelItem=>item.Value)
@DisplayFor(modelItem=>item.Date)
@foreach(item.Tags中的var标记)
{
@DisplayFor(modelItem=>tag.Name)
}
}
问题是标签是不可数的。它呈现如下:

我想分离标签,以便它们易于阅读(例如“Tag1,Tag2,…”)或带有管道符号(“|”)。我想这很容易做到,但由于我不能很好地使用C#/ASP,我无法让它工作。尝试在
@Html.DisplayFor(modelItem=>tag.Name)
之后添加文本,但这会导致编译错误

如果这改变了什么,则添加标签。

一种解决方案可以是:

<td>
    @foreach (var tag in item.Tags)
    {
        @Html.DisplayFor(modelItem => tag.Name)<text>|</text>
    }
</td>

@foreach(item.Tags中的var标记)
{
@DisplayFor(modelItem=>tag.Name)|
}

我将通过在模型中创建新属性,将显示逻辑移动到模型中:

@using System.Linq;

...

public TagDisplayText
{
    get
    {
        return string.Join(", ", Tags.Select(x => x.Name));
    }
}
然后从视图中调用此属性:

<td>
    @Html.DisplayFor(m => m.TagDisplayText)
</td>

@DisplayFor(m=>m.TagDisplayText)

继续往下走。你也可以这样做。 如果要应用css/修改dom元素

<span class="sometext">@Html.DisplayFor(modelItem => tag.Name) some text </span>
@Html.DisplayFor(modelItem=>tag.Name)一些文本

> p>您应该考虑使用显示模板。

要创建显示模板,您需要在
Views/Shared/DisplayTemplates
文件夹中添加新视图。在您的示例中,您可以创建名为“标记”的视图,其外观如下:

@model IEnumerable<Tag>

@{
    var tags = Model != null ? Model.ToList() : new List<Tag>();
    var tagsCount = tags.Count;
}

@for (int i = 0; i < tagsCount; i++)
{
    @tags[i].Name
    if (i < tagsCount - 1)
    {
        <text> | </text>
    }
}
@model IEnumerable<IDisplayItem>

@{
    var items = Model != null ? Model.ToList() : new List<IDisplayItem>();
    var itemsCount = items.Count;
}

@for (int i = 0; i < itemsCount; i++)
{
    @items[i].DisplayValueFn()
    if (i < itemsCount - 1)
    {
        <text> | </text>
    }
}
您还可以考虑使这些代码更通用和可重用。视图不能具有通用模型,因此您可以为此创建包装器:

 public interface IDisplayItem
 {
     dynamic Item { get; }
     Func<string> DisplayValueFn { get; }
 }

 public class DisplayItem<T> : IDisplayItem
 {
     public T Item { get; set; }

     dynamic IDisplayItem.Item
     {
         get { return Item; }
     }

     public Func<T, string> DisplayValueFn { get; set; }

     Func<string> IDisplayItem.DisplayValueFn
     {
         get { return () => DisplayValueFn(Item); }
     }
 }
公共接口IDisplayItem
{
动态项{get;}
Func DisplayValueFn{get;}
}
公共类DisplayItem:IDisplayItem
{
公共T项{get;set;}
动态IDisplayItem.Item
{
获取{return Item;}
}
public Func DisplayValueFn{get;set;}
Func IDisplayItem.DisplayValueFn
{
获取{return()=>DisplayValueFn(项);}
}
}
然后显示模板将如下所示:

@model IEnumerable<Tag>

@{
    var tags = Model != null ? Model.ToList() : new List<Tag>();
    var tagsCount = tags.Count;
}

@for (int i = 0; i < tagsCount; i++)
{
    @tags[i].Name
    if (i < tagsCount - 1)
    {
        <text> | </text>
    }
}
@model IEnumerable<IDisplayItem>

@{
    var items = Model != null ? Model.ToList() : new List<IDisplayItem>();
    var itemsCount = items.Count;
}

@for (int i = 0; i < itemsCount; i++)
{
    @items[i].DisplayValueFn()
    if (i < itemsCount - 1)
    {
        <text> | </text>
    }
}
@model IEnumerable
@{
var items=Model!=null?Model.ToList():new List();
var itemscont=items.Count;
}
@对于(int i=0;i
您可以通过以下方式显示示例中的标记:

var tags = item.Tags
    .Select(tag => new DisplayItem<Tag>
    {
        Item = tag,
        DisplayValueFn = x => x.Name
    });

@Html.DisplayFor(x => tags, "Collection")
var tags=item.tags
.选择(标记=>new DisplayItem
{
项目=标签,
DisplayValueFn=x=>x.名称
});
@DisplayFor(x=>tags,“Collection”)

您可以将每个
标记.名称
包装在一个样式为
内联块的元素中
并添加填充或边距。这很好,我会将您的帖子标记为答案,因为它完全符合我的要求。你能把我的答案标记为正确吗?这个解决方案的问题是,最后你会有额外的“|”