名称的Razor子串

时间:2012-02-22 16:09:58

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

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

我有以下内容:

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

虽然程序试图运行它时出现以下错误:

模板只能用于字段访问,属性访问,单维数组索引或单参数自定义索引器表达式。

3 个答案:

答案 0 :(得分:1)

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

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)

答案 1 :(得分:0)

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

但是,您可以编写自己的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);
    }
}

答案 2 :(得分:0)

在子字符串之前,检查字符串的长度,否则你将得到索引超出范围的异常;

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