如何使用MVC Html Helpers截断字符串?

时间:2014-05-09 19:38:01

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

我试图截断一个长字符串,仅在我的索引页面上显示。它显示如下:

<td>
    @Html.DisplayFor(modelItem => item.Description)
</td>

描述可以是500个字符长,但我无法在该网格布局上显示那么多。我想只显示前25个,因为他们可以在详细信息页面上看到所有内容,但我似乎无法在模型级别截断它。

这样的事情会很好:

@Html.DisplayFor(modelItem => item.Description.Take(25))
@Html.DisplayFor(modelItem => item.Description.Substring(0,25)

修改

当我尝试使用任何一种方法时,我在运行时遇到以下异常。

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

7 个答案:

答案 0 :(得分:22)

不要使用html帮助器。就这样做:

@item.Description.Substring(0, Math.Min(item.Description.Length, 25));

我假设您处于某个循环中,其中item是当前元素。

答案 1 :(得分:5)

您可以使用扩展方法执行此操作。

public static string Truncate(this string source, int length)
{
    if (source.Length > length)
    {
        source = source.Substring(0, length);
    }

    return source;
}

然后在你看来:

@item.Description.Truncate(25)

答案 2 :(得分:4)

您可以在数据到达View之前截断数据,也可以使用此Razor:

@{
    var shortDescript = String.Concat(modelItem.Take(25));
}
@Html.DisplayFor(modelItem => shortDescript)

答案 3 :(得分:1)

您可以考虑为需要的实例创建一个特殊的模型属性:

public class MyModel
{
    public string MyDescription {get; set;}
    public string MyShortDescription {
        get 
        {
              return Truncate(MyDescription, 25);
        }
}

private string Truncate(string, howMany)
{
   // Code to perform the substring here
}

@Html.DisplayFor(modelItem => item.MyShortDescription);

答案 4 :(得分:1)

如果您想使用HTML帮助,请尝试。假设您希望在第一个空格 .IndexOf(&#39;&#39;)之前获取字符串的一部分(或者您可以像您所说的那样使用预定义的索引25):

@Html.DisplayFor(modelItem => item.Description).ToString().Substring(0,item.Description.IndexOf(' '))

答案 5 :(得分:0)

尝试扩展

public static string TruncateMiddle(this string value, int lengthExpected, string separator = "...")
    {
        if (value.Length <= lengthExpected) return value;

        decimal sepLen = separator.Length;
        decimal charsToShow = lengthExpected - sepLen;
        decimal frontChars = Math.Ceiling(charsToShow / 2);
        decimal backChars = Math.Floor(charsToShow / 2);

        return value.Substring(0, (int)frontChars) + separator + value.Substring(value.Length - (int)backChars);            
    }

使用

MyLongString.TruncateMiddle(50)

返回类似这样的内容:Lorem ipsum dolor坐下来...... onsectetur cras amet。

答案 6 :(得分:0)

ASP Net Core 3 MVC的HTML帮助器。

public static HtmlString Truncate(this IHtmlHelper helper, string text, int maxLength = 100)
{
    if (text == null) return new HtmlString("");

    if (text.Length > maxLength)
    {
        text = text.Substring(0, maxLength) + "...";
    }
    return new HtmlString($"{text}");
}

在cshtml文件中使用

@Html.Truncate(item.Description)

或者您可以使用param

@Html.Truncate(item.MusicUrl, 50)