我可以修改Html.DisplayFor来显示任何字符的子字符串

时间:2015-02-24 17:31:14

标签: asp.net-mvc razor asp.net-mvc-5 html-helper

我正在开发一个asp.net mvc 5.2.2。使用Razor视图引擎的Web应用程序。我试图修改默认的Html.DisplayFor以显示100个字符的子字符串,然后在某些视图上显示“...”?这可能实现吗? 感谢

5 个答案:

答案 0 :(得分:3)

Html.DisplayFor是一个模板化的助手。 MVC为最常见的C#类型内置了一些默认模板。对于字符串,它几乎只是按原样转储字符串值。

您可以通过将自己的显示模板添加到Views\Shared\DisplayTemplates\来覆盖内置插件。您添加的视图需要以三种方式之一命名:

  1. 一种类型(标准C#类型或您自己的类),例如String.cshtmlDateTime.cshtmlBoolean.cshtml
  2. DataType枚举的成员,例如EmailAddress.cshtmlImageUrl.cshtml等(这需要使用相应的DataType属性修饰属性)
  3. 将您想要的任何内容与使用UIHint属性修饰属性相结合。例如,[UIHint("Foo")]将使用名为Foo.cshtml的显示模板。
  4. 在您的情况下, 可以使用String.cshtml的内容,例如:

    @model String
    
    @Model.Substring(0, 100)…
    

    但是,我不认为您真的希望将其应用于您网站上呈现的每个字符串,无处不在。在这里使用UIHint和自定义显示模板可能是更好的选择。创建一个名为TruncatedString.cshtml的显示模板,然后使用[UIHint("TruncatedString")]修饰您想要显示截断的任何属性。

    仅当您坚持使用Html.DisplayFor时才会这样做。实际上,添加字符串扩展名可能会更好,如:

    public static class StringExtensions
    {
        public static string Truncate(this string s, int length, string suffix = "...", bool html = false)
        {
            s = s ?? string.Empty;
            s = System.Net.WebUtility.HtmlDecode(s);
            if (s.Length > length)
            {
                s = s.Substring(0, length + 1);
                s = s.Substring(0, Math.Min(s.Length, s.LastIndexOf(" ") == -1 ? 0 : s.LastIndexOf(" ")));
                s = s + suffix;
            }
    
            if (html)
            {
                return System.Net.WebUtility.HtmlEncode(s.Trim());
            }
            else
            {
                return s.Trim();
            }
        }
    }
    

    然后,您可以在视图中执行以下操作:

    @Model.SomeLongString.Truncate(100)
    

答案 1 :(得分:0)

答案 2 :(得分:0)

我个人倾向于在模型中创建另一个只读属性,并返回一个截断值。可能使用这里提到的截断扩展。

答案 3 :(得分:0)

您可以使用下一句话:

@ Html.DisplayFor(Function(modelItem)item.name_field).ToString()。Substring(1,n)

答案 4 :(得分:0)

@Html.DisplayFor(modelItem => item.CreateDate).ToString().Substring(0,10)