2013-01-19 21 views
1

我试图使用.tostring.remove(n)从字符串的末尾去除字符。代码低于IIf声明确认该字符串是ISNullOrEmpty并返回TrueFalse。如果true返回""字符串被放置在aspx页面(这工作正常),问题出现在第二部分,当IsNullOrEmpty返回False时触发。InLine IIF Expression&DataBinder.Eval未按预期方式运行

在一个False值字符串长度被检查,如果字符串是等于或大于17个字符长则返回一个True值和字符串使用.ToString.Remove(n)如果返回False值,则该字符串被截断保持不动。

的问题是,如果该字符串是1个字符或20个字符以下错误保持发生: startIndex must be less than length of string

这里是代码块:

<%# IIf(String.IsNullOrEmpty(Convert.ToString(DataBinder.Eval(Container.DataItem, "SponsorEmail"))), 
"", 
IIf(Convert.ToString(DataBinder.Eval(Container.DataItem, "SponsorEmail")).Length > 17, 
Eval("SponsorEmail").ToString.Remove(17), 
Eval("SponsorEmail")))%> 

的数据库表中的DataBinder的被拉伸它的数据来自NULLS,只有在任何给定记录存在NULL或空字符串时才会发生。

请帮忙,这让我疯狂!

回答

1

iif相比,您遇到的问题是每次都会评估整个陈述,而不仅仅是真实或虚假的部分。这意味着Remove(17)每次都被触发,无论条件是什么评估。

您可以用下面的代码证明了这一点:

Dim sValue = IIf(Nothing, DoEval("true"), DoEval("false")) 
    Console.WriteLine("Final " & sValue) 

Private Function DoEval(value As String) As String 
    Console.WriteLine(value) 
    Return value 
End Function 

在这种情况下,你会看到真假两写入到输出窗口。

我们通过使用iif引入了很多问题,我们禁止在我们的应用程序中使用它。

如果切换到传统的if then else条款,您将会好得多。

+0

很高兴你告诉我这个,我会花更多的时间试图理解为什么当字符串不够长时,它试图执行那部分代码.... –