【问题标题】:Index and length must refer to a location within the string?索引和长度必须引用字符串中的位置?
【发布时间】:2011-09-13 07:24:55
【问题描述】:

我正在尝试获取前 50 个字母,因此我使用了subString 函数来获取它。

如您所见,我使用此代码获取它:

<%# Eval("BannerDescription").ToString.Substring(1, 50)%>

但不幸的是,它不起作用,并且出现错误消息:

索引和长度必须引用字符串中的位置。

那么有没有其他办法解决呢?

因为用户是控制数据输入的人!有时他会输入 10 个字母,有时可能会输入 1000 个字母,那么我该如何解决呢?

我都试过了,但我们可以这样用吗:

&lt;%# IIf(Eval("BannerDescription").ToString().Length &gt; 49, Eval("BannerDescription").ToString().Substring(0, 49), Eval("BannerDescription"))%&gt;

谢谢。

【问题讨论】:

  • 是 - 不要指定大于字符串的长度。错误消息准确地告诉您问题所在。
  • 是的,我知道。因为用户是控制数据输入的人!有时他会进入 10 窝,有时可能会进入 1000 窝,我该如何解决这个问题?
  • 呃,检查长度。 (说真的,谁赞成这个?)
  • 我只想添加一个评论,这个错误是完全荒谬的。如果长度参数比字符串长,子字符串应该只返回到字符串的末尾。这就是 all 以前版本的 Basic 使用 Left() 函数的方式。大多数时候我使用 Substring,它是为了替换 .net 中缺少的 Left() 和 Right() 函数。在什么情况下返回这个长度错误会有帮助?
  • 我必须同意布拉德·马修斯的观点。我已经被这个完全荒谬的例外所困扰好几次了。

标签: .net asp.net vb.net


【解决方案1】:

也许是这样的 -

<%# Eval("BannerDescription").ToString().Substring(0, Math.Min(Eval("BannerDescription").ToString().Length, 50)) %>

【讨论】:

    【解决方案2】:
    <%# new string(Eval("BannerDescription").ToString().Take(50).ToArray()) %>
    

    【讨论】:

    • .Take 不是字符串的成员!
    • @HAJJAJ:Take 是 Linq 的一部分,因为字符串是 IEnumerable,所以可以使用 Take。但是 Substring 可能是更好的选择。
    • 添加 到页面上
    【解决方案3】:

    你应该能够实现一个函数,如果它太长,它会给你一个更短的版本:

    <%
        Function ShortVersion (strData, strLen)
            If Len (strData) > strLen Then
                ShortVersion = Left (strData, strLen)
            Else
                ShortVersion = strData
            End If
        End Function
    %> 
    

    【讨论】:

      【解决方案4】:

      如果这是您的问题,并且您使用的是 .NET 3.5,您可以尝试:

      public static class StringEx
      {
          public static string SubstringNE(this string str, int index, int length)
          {
              if (index >= str.Length) 
              {
                  return String.Empty;
              }
      
              if (index + length > str.Length)
              {
                  return str.Substring(index);
              }
      
              return str.Substring(index, length);
          }
      }
      

      你调用它的方式与Substring 相同,但它不会因为错误的索引/长度而抛出。举个例子:&lt;%# Eval("BannerDescription").ToString().SubstringNE(1, 50)%&gt;NE 代表“无例外”。

      【讨论】:

        【解决方案5】:

        注意:此答案适用于,因为发布此答案时问题具有此特定标签。


        这将给你不超过 50 个字符:

        <%# Eval("BannerDescription").ToString().Length > 50 ? Eval("BannerDescription").ToString().Substring(0, 50) : Eval("BannerDescription").ToString() %>
        

        更好的是,在代码隐藏 (.cs) 中引入一个可在标记中引用的受保护方法:

        标记:

        <%# GetStringMaxLength(Eval("BannerDescription").ToString(), 50) %>
        

        代码隐藏:

        protected static string GetStringMaxLength(string text, int maxLength)
        {
            if (string.IsNullOrEmpty(text))
            {
                return string.Empty;
            }
        
            if (text.Length > maxLength)
            {
                return text.Substring(0, maxLength);
            }
        
            return text;
        }
        

        这样看起来更干净。 :-)

        【讨论】:

        • “?”此处不能使用字符
        • 啊哈,好吧,这就解释了为什么它不起作用。不知道这是否可能(我在这里有点新),但你应该调整你的问题标签;添加 vb.net 并删除 C#。
        【解决方案6】:

        50 大于结果字符串的长度,如果为真,您的代码在所有情况下都会失败。您不能提供大于其中字符数量的参数。 使用 String.Length 属性进行操作,这将为您提供字符串中的字符数。因此,如果您的字符串长于 50 个字符(或等于 50 个),您可以说您将获得前 50 个字符,否则您只能获得小于 50 个字符的整个字符串。

        您可以使用此代码:

        Eval("BannerDescription").ToString().Length > 49 ? Eval("BannerDescription").ToString().SubString(0, 49) : Eval("BannerDescription").ToString()

        问候, 彼得

        【讨论】:

        • 是的,我知道。因为用户是控制数据输入的人!有时他会进入 10 窝,有时可能会进入 1000 窝,我该如何解决这个问题?
        • @HAJJAJ,这是一封 而不是垃圾。不过,将其称为角色可能更正确。
        【解决方案7】:

        使用Below Code sn-p,我在项目中使用过很多次。

        <%# Eval("BannerDescription").ToString().Length <= 22 ? Eval("BannerDescription") : string.Format("{0}....", Eval("BannerDescription").ToString().Substring(0,22))%>
        

        【讨论】:

        • “?”此处不能使用字符
        • 我认为这适用于 c# 而不是 vb.net
        猜你喜欢
        • 1970-01-01
        • 2016-03-15
        • 1970-01-01
        • 1970-01-01
        • 2012-06-24
        • 1970-01-01
        • 2014-08-06
        相关资源
        最近更新 更多