【问题标题】:Razor Substring of Name名称的剃刀子串
【发布时间】:2012-02-22 16:09:57
【问题描述】:

我需要得到名字的首字母

我有以下:

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

当程序尝试运行它时,我收到以下错误:

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

【问题讨论】:

  • 你刚刚在 20 分钟前问了这个确切的问题,得到了相同的答案。
  • @tvanfosson,不知道为什么 OP 在他之前的问题中接受了这个答案,因为答案完全错误并且不起作用。
  • 什么会阻止你使用@item.FirstName.Substring(1,1)?

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


【解决方案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)

【讨论】:

  • 所以我可以在我的视图中添加这一切?
  • @NatePet,不,首先您更改视图模型类(包含FirstName 属性的类)以添加属性,然后在视图中使用此新属性。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    在substring之前,检查字符串的长度,否则会得到index out of range异常;

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

    【讨论】:

    • @if (!string.IsNullOrEmpty(item.title)){ //你的代码 }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 2020-07-13
    • 2011-06-09
    • 2015-03-29
    相关资源
    最近更新 更多