【问题标题】:MVC.net razor substring in view problemMVC.net razor substring in view问题
【发布时间】:2026-02-06 18:20:17
【问题描述】:

我在使用剃须刀和模型时遇到问题。

在我看来,我有一个带有“文章”对象列表的模型。

所以我用@MvcHtmlString.Create(article.Intro) 做了一个 foreach,效果很好。

然后当我想要那个介绍的子字符串时:

@MvcHtmlString.Create(article.Intro).ToHtmlString().Substring(0, 50) 页面以无限循环结束(当 razor 无法渲染某些内容时经常发生这种情况)而没有错误。

有谁知道我怎样才能得到这个子字符串?

【问题讨论】:

  • 你为什么使用 MvcHtmlString.Create (而不仅仅是@article.Intro)?您的 Intro 字段是否已经进行了 HTML 编码?如果没有,您将导致 XSS 漏洞。如果是,那么您不能只使用 Substring 因为它可能会切入像 &. 这样的实体的中间
  • @article.intro 只是来自 db 的普通 nvarchar,我做了 mvchtmlstring,因为我认为它可能会解决我的子字符串问题,因为我不是直接在属性上工作,而是在本地创建的 htmlstring

标签: asp.net-mvc viewmodel razor


【解决方案1】:
如果您的任何文章介绍短于 50 个字符,

Substring(0, 50) 将引发 ArgumentOutOfRangeException 异常。这可能是您出现奇怪问题的原因。

此外,MvcHtmlString 的使用是不正确的,因为您的数据显然还没有经过 HTML 编码。

所以解决方案可能是:

@article.Intro.Substring(0, Math.Min(article.Intro.Length, 50))

【讨论】:

  • 这不是 ArgumentOutOfRangeException 错误,我所有的字符串都很好。这个问题经常出现在剃须刀上。当 razor 在渲染时出现问题时,它只是不返回任何标题,甚至不返回 asp.net 错误页面,因此页面似乎一直在渲染。字符串是 html。
  • 我相信这与模型中的属性链接到数据上下文并像动态一样处理这一事实有关。当 razor 执行它的视图渲染时,它无法将动态属性传递给函数,并且它崩溃了。但我不确定
【解决方案2】:

为什么不直接对您的文章进行子串。Intro?

@MvcHtmlString.Create(article.Intro.Substring(0, 50))

【讨论】:

  • 这可能会导致不正确的行为。如果位置 49 的子字符串开始一个新的表标签怎么办,那么输出将是 "...blablabla
  • 无论哪种方式都存在这个问题; MvcHtmlString 只是告诉视图引擎不要对字符串值进行 HtmlEncode - 也就是“”不会变成“<span>”。
  • 这也不起作用。我先试过这个。即使我所有的字符串都大于 20 en 我也会做 article.Intro.Substring(0, 2) 页面进入无限循环。我认为这与剃须刀绑定数据的方式有关。我已经用另一种方法解决了,但我想知道为什么会这样(经常发生)
  • 如果一个简单的子字符串调用导致无限循环,我认为这里会发生其他事情。如果删除子字符串,它会呈现正常吗?
  • 是的,然后它工作正常,当我做 substring(0) 也很好 substring(more then 0,int) ... 不好