Substring()的问题 - ArgumentOutOfRangeException

Iva*_*nov 24 c# asp.net

我有一个转发器,显示我的Projects表中的数据.有projectId,名称和描述.我在描述中使用了Substring(1,240).但有时字符串短于240,所以我得到了ArgumentOutOfRangeException.如果我得到例外,你能告诉我如何显示整个文本吗?这是我的代码.

    <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<asp:Panel ID="pnlDisplayProjects" runat="server" Visible="true">
    <center><h2><b>???????</b></h2></center>
        <asp:Repeater ID="rptrProjects" runat="server">
            <HeaderTemplate>
                <table border="1" cellpadding="2" cellspacing="2" align="center" width="80%" style="background-color:#F7F6F3;">
            </HeaderTemplate>
            <ItemTemplate>
                <tr>
                    <td align="left" style="width:40px">
                        <asp:Label ID="LblProjectId" runat="server" Text='<%# Eval("ProjectID") %>' />
                    </td>
                    <td align="center">
                        <asp:Label ID="LblName" runat="server" Text='<%# Eval("Name") %>' />
                    </td>
                </tr>
                <tr>
                    <td colspan="2">
                        <asp:Label ID="LblDescription" runat="server" Text='<%# Eval("Description").ToString().Substring(1, 240) + "..." %>'/>
                        <asp:HyperLink ID="HlMore" runat="server" NavigateUrl='<%#"~/Project/ViewProject.aspx?projectId=" + Eval("ProjectID") %>' Text="More" />
                    </td>
                </tr>
            </ItemTemplate>
            <FooterTemplate>
                </table>
            </FooterTemplate>
        </asp:Repeater>
</asp:Panel>
Run Code Online (Sandbox Code Playgroud)

 protected override void OnPreRender(EventArgs e)
    {
        var table = Projects.GetTableWithProjects();

        if (table.Rows.Count > 0)
        {
            rptrProjects.DataSource = table;
            rptrProjects.DataBind();
        }
        else
        {
            pnlDisplayProjects.Visible = false;
            Master.PrintMessage("There are no projects.");
        }
    }
Run Code Online (Sandbox Code Playgroud)

Ior*_*nev 38

string dec = "description";
string result = dec.Substring( 0, dec.Length > 240 ? 240 : dec.Length )
Run Code Online (Sandbox Code Playgroud)

  • 只是一个健全性检查 - "SubString"应该是`Substring`,对吧? (5认同)

Jon*_*eet 37

如果您使用的是.NET 3.5,我建议您编写一个单独的扩展方法.像这样的东西:

public static string SafeSubstring(this string text, int start, int length)
{
    return text.Length <= start ? ""
        : text.Length - start <= length ? text.Substring(start)
        : text.Substring(start, length);
}
Run Code Online (Sandbox Code Playgroud)

基本上这是一个版本,Substring除非开始或长度为负,否则永远不会抛出异常(在这种情况下,我不知道它能合理地返回什么).

你这样称呼它:

Eval("Description").ToString().SafeSubstring(1, 240) + "..."
Run Code Online (Sandbox Code Playgroud)

这样做的缺点是它将包括省略号(...),即使它实际上根本没有截断字符串...


Flo*_*lkl 13

description.Substring(0, Math.Min(description.Length, 240));
Run Code Online (Sandbox Code Playgroud)


sup*_*cal 5

基于 Jon Skeet 的回答,我认为它应该检查 null 否则它不是一个完全安全的方法:)

public static string SafeSubstring(this string text, int start, int length)
{
    if (text == null) return null;      

    return text.Length <= start ? ""
        : text.Length - start <= length ? text.Substring(start)
        : text.Substring(start, length);
}
Run Code Online (Sandbox Code Playgroud)