我试图在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>
}
问题是标签IEnumerable。它呈现如下:
我想分隔标签,以便它们易于阅读(例如“Tag1,Tag2,...”)或管道标志(“|”)。我想这很容易做到,但由于我不能很好地使用C#/ ASP,所以我无法让它工作。尝试在@Html.DisplayFor(modelItem => tag.Name)
之后添加文本,但这会给我编译错误。
如果这会改变任何内容,则标签会添加Tag-it。
答案 0 :(得分:5)
一种解决方案可能是:
<td>
@foreach (var tag in item.Tags)
{
@Html.DisplayFor(modelItem => tag.Name)<text>|</text>
}
</td>
答案 1 :(得分:1)
我会通过在模型中创建一个新属性来将显示逻辑移动到模型中:
@using System.Linq;
...
public TagDisplayText
{
get
{
return string.Join(", ", Tags.Select(x => x.Name));
}
}
然后从您的视图中调用此属性:
<td>
@Html.DisplayFor(m => m.TagDisplayText)
</td>
答案 2 :(得分:0)
走得更远。你也可以这样做。 如果你想应用css / modify dom元素。
<span class="sometext">@Html.DisplayFor(modelItem => tag.Name) some text </span>
答案 3 :(得分:0)
您应该考虑使用显示模板。
要创建显示模板,您需要在Views/Shared/DisplayTemplates
文件夹中添加新视图。在您的示例中,您可以创建名为&#34; Tags&#34;看起来像那样:
@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>
}
}
然后在主视图中:
@Html.DisplayFor(x => item.Tags, "Tags")
您还可以考虑使这些代码更通用和可重用。视图不具有通用模型,因此您可以为其创建包装器:
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); }
}
}
然后显示模板将如下所示:
@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>
}
}
您可以通过以下方式显示示例中的代码:
var tags = item.Tags
.Select(tag => new DisplayItem<Tag>
{
Item = tag,
DisplayValueFn = x => x.Name
});
@Html.DisplayFor(x => tags, "Collection")