需要截断Razor HTML DisplayFor Helper

时间:2014-02-18 16:29:51

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

我试图截断有时非常大的文本字段,或者在其他时候从数据库中删除它,即

@Html.DisplayFor(modelItem => item.MainBiography)

并在最后用三个点替换。

我已经尝试过子串函数,但不断出错。

任何指针,谢谢!

更新

......并不是非常重要所以我尝试使用

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

并获取以下错误代码:

  

System.InvalidOperationException未由用户代码处理HResult = -2146233079 Message = Templates只能用于字段访问,属性访问,单维数组索引或单参数自定义索引器表达式。 Source = System.Web.Mvc -

4 个答案:

答案 0 :(得分:9)

你最好在模型中创建一个不同的属性,拿起MainBiography并最终缩短它。

像这样:

// This is your property (sampled)
public string MainBiography { get; set; }

//How long do you want your property to be at most ?
//(Best practice advices against magic numbers)
private int MainBiographyLimit = 100;

//You probably need this if you want to use .LabelFor() 
//and let this property mimic the "full" one  
[Display(Name="Main Biography")]
public string MainBiographyTrimmed
{
    get
    {
        if (this.MainBiography.Length > this.MainBiographyLimit)
            return this.MainBiography.Substring(0, this.MainBiographyLimit) + "...";
        else 
            return this.MainBiography;
    }
}

用法是

@Html.DisplayFor(item => item.MainBiographyTrimmed)

另一种方法是建立一个完整的视图模型,但我发现它经常过度杀伤。

答案 1 :(得分:2)

DisplayFor需要一个表示属性的表达式。

您可以向模型添加属性:

public string MainBiographyTrimmed
{
    get
    {
        if (MainBiography.Length) > 10
            return MainBiography.Substring(0, 10) + "...";
    }
}

然后在你的视图中做:

@Html.DisplayFor(item => item.MainBiographyTrimmed)

答案 2 :(得分:1)

您可以编写一个字符串扩展方法,并在您的模型属性(字符串类型)上调用它。您可以传递子字符串操作的限制。

public static class StringExtensions
{
    public static string SubStringTo(this string thatString, int limit)
    {
        if (!String.IsNullOrEmpty(thatString))
        {
            if (thatString.Length > limit)
            {
                return thatString.Substring(0, limit);
            }
            return thatString;
        }
        return string.empty;
    }
}

并在您的视图中,导入具有扩展方法的命名空间,并在字符串属性上调用该方法。

@Html.DisplayFor(modelItem => item.MainBiography.SubStringTo(10)) 

答案 3 :(得分:0)

尝试使用Html.Display代替DisplayFor,如下所示:

 @Html.Display(item.MainBiography.Substring(0, 10), null, "MainBiography")

顺便说一句,你们两个lambda语句都是无效的。参数名称应该是相同的。

不喜欢这样:

@Html.DisplayFor(modelItem => item.MainBiography)

应该是:

@Html.DisplayFor(modelItem => modelItem.MainBiography)

或者:

@Html.DisplayFor(item => item.MainBiography)