繁体   English   中英

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

[英]ASP.net add text after Html.DisplayFor

我试图在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

一种解决方案可能是:

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

我会通过在模型中创建一个新属性来将显示逻辑移动到您的模型:

@using System.Linq;

...

public TagDisplayText
{
    get
    {
        return string.Join(", ", Tags.Select(x => x.Name));
    }
}

然后从您的视图中调用此属性:

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

走得更远。 你也可以这样做。 如果要应用css / modify dom元素。

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

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

要创建显示模板,您需要在Views/Shared/DisplayTemplates文件夹中添加新视图。 在您的示例中,您可以创建名为“Tags”的视图,该视图看起来像这样:

@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")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM