Razor基板名称

本文关键字:Razor | 更新日期: 2023-09-27 18:25:38

我需要获得名字的第一个首字母

我有以下内容:

     @Html.DisplayFor(modelItem => item.FirstName.Substring(1,1)) 

当程序试图运行它时,我得到了以下错误:

模板只能与字段访问、属性访问、一维数组索引或单参数自定义索引器表达式一起使用。

Razor基板名称

只需在视图模型中添加一个属性:

public string FirstName { get; set; }
public string FirstLetterOfName
{
    get
    {
        // TODO: a minimum amount of error checking
        // might be good here for cases when FirstName
        // is null or an empty string
        return this.FirstName.Substring(1, 1);
    }
}

然后:

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

如果你现在告诉我,你没有使用视图模型,而是直接将你的域实体传递给你的视图(这是一个非常糟糕的设计),你可能会使用一个自定义模板:

@Html.DisplayFor(modelItem => item.FirstName, "FirstLetter") 

然后定义具有以下内容的自定义显示模板~/Views/Shared/DisplayTemplates/FirstLetter.cshtml

@ViewData.TemplateInfo.FormattedModelValue.Substring(1, 1)

你不能这样做,因为映射到你的卑鄙小人不会这样工作。就像异常消息告诉您只能将其与属性一起使用一样。

然而,您可以编写自己的HtmlHelper扩展来执行您想要的

public static class HtmlHelpers
{
    public static MvcHtmlString CustomDisplayFor(this HtmlHelper<Person> htmlHelper, Expression<Func<Person, string>> expression)
    {
          var customBuildString = string.Empty;
          //Make your custom implementation here
          return MvcHtmlString.Create(customBuildString);
    }
}

在使用子字符串之前,请检查字符串的长度,否则会出现索引超出范围的异常;

@MvcHtmlString.Create(item.title.Length > 20 ? @item.title.ToString().Substring(0, 20):@item.title.ToString())