我正在开发一个asp.net mvc 5.2.2。使用Razor视图引擎的Web应用程序。我试图修改默认的Html.DisplayFor
以显示100个字符的子字符串,然后在某些视图上显示“...”?这可能实现吗?
感谢
答案 0 :(得分:3)
Html.DisplayFor
是一个模板化的助手。 MVC为最常见的C#类型内置了一些默认模板。对于字符串,它几乎只是按原样转储字符串值。
您可以通过将自己的显示模板添加到Views\Shared\DisplayTemplates\
来覆盖内置插件。您添加的视图需要以三种方式之一命名:
String.cshtml
,DateTime.cshtml
,Boolean.cshtml
等DataType
枚举的成员,例如EmailAddress.cshtml
,ImageUrl.cshtml
等(这需要使用相应的DataType
属性修饰属性)UIHint
属性修饰属性相结合。例如,[UIHint("Foo")]
将使用名为Foo.cshtml
的显示模板。在您的情况下, 可以使用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)
您可以使用编辑器模板和UIHint来实现:
答案 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)