2011-03-23 53 views
0

我遇到了剃须刀和模型的问题。MVC.net剃刀子串中的问题

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

所以我做了一个foreach @MvcHtmlString.Create(article.Intro)这很好。

然后,当我想要介绍的一个子:

@MvcHtmlString.Create(article.Intro).ToHtmlString().Substring(0, 50)的页面中无限循环结束没有错误(当剃刀无法呈现的东西这经常发生)。

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

+1

你为什么要使用_MvcHtmlString.Create_(而不只是@ article.Intro)?你的_Intro_字段已经被HTML编码了吗?如果不是,则导致XSS漏洞。如果是这样,那么你不能只使用_Substring_,因为它可能会切断像&这样的实体。 – Codo 2011-03-23 12:15:53

+0

@ article.intro只是简单的nvarchar从数据库,我做了mvchtmlstring,因为我把它可能会解决我的子字符串问题,因为我不是直接在属性上工作,而是在本地创建的htmlstring – Nealv 2011-03-23 12:25:20

回答

4

为什么不直接将您的文章串入?

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

这可能会导致不正确的行为。如果位置49的子串开始新的表标记,那么输出将是“... blablabla Polity 2011-03-23 12:11:37

+0

这个问题以任何方式存在; MvcHtmlString只是告诉视图引擎不要HtmlEncode字符串值 - 又名“”不变成“<范围>”。 – Tejs 2011-03-23 12:14:17

+0

这也不起作用。我先试了一下。即使当我的所有字符串都大于20时,我也会做article.Intro.Substring(0,2)页面进入无限循环。我认为它与剃刀绑定数据的方式有关。我已经解决了另一种方式,但我想知道为什么会发生这种情况(它经常发生) – Nealv 2011-03-23 12:23:17

4

Substring(0, 50)抛出ArgumentOutOfRangeException异常,如果你的任何文章的前奏是超过50个字符短。这可能是你奇怪问题的原因。

此外,使用MvcHtmlString是不正确的,因为你的数据显然不是HTML编码。

因此,一个解决办法是:

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

这不是一个ArgumentOutOfRangeException错误,我所有的字符串都很好。这个问题经常发生在剃刀上。当剃刀有一个问题,而渲染它只是没有返回任何头,甚至没有asp.net错误页面,所以页面似乎继续渲染。该字符串是html。 – Nealv 2011-03-24 09:45:35

+0

我认为它与模型中的属性链接到datacontext并像动态一样处理有关。当剃须刀执行它的视图渲染时,它不能将动态属性传递给该函数,并且它会崩溃。但我不确定 – Nealv 2011-03-24 09:47:03