【问题标题】:Why is textbox.Text returning an empty string?为什么 textbox.Text 返回一个空字符串?
【发布时间】:2026-01-13 19:15:02
【问题描述】:

首先让我以我知道这个问题已经被问过很多次这一事实作为开场白。我已尝试实施我已阅读的所有内容,但尚未解决我的问题。

我在 GridView 中显示了一个购物车,我正在尝试让更新功能正常工作。在我单击编辑(在相关行上)并更改文本框中的值,然后单击更新后,我总是返回一个空字符串。

我已经阅读了无数关于它是 PostBack 问题的帖子,但是我已将我的 DataBind 方法封装在 if(!Page.IsPostBack){} 中,所以我不认为这是我的问题。

这些是我的 CodeFile 中的相关方法:

protected void Page_Load(object sender, EventArgs e)
{

    if (Session["thisCart"] == null)
    {
        Session["thisCart"] = new ShoppingCart();
    }
    thisCart = (ShoppingCart)Session["thisCart"];

    if (!Page.IsPostBack)
    {
        FillData();
    }

}

private void FillData()
{
    gvShoppingCart.DataSource = thisCart.Items;
    gvShoppingCart.DataBind();
    if (thisCart.Items.Count == 0)
    {
        lblGrandTotal.Visible = false;
    }
    else
    {
        lblGrandTotal.Text = string.Format("Grand Total = {0,19:C}", thisCart.GrandTotal);
        lblGrandTotal.Visible = true;
    }
}

protected void gvShoppingCart_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    TextBox txtQuantity = (TextBox)gvShoppingCart.Rows[e.RowIndex].Cells[3].Controls[0];
    int quantity = Int32.Parse(txtQuantity.Text);
    thisCart.Update(e.RowIndex, quantity);
    gvShoppingCart.EditIndex = -1;
    FillData();        
}

这是aspx文件:

<asp:GridView ID="gvShoppingCart" runat="server" AutoGenerateColumns="False" OnRowCancelingEdit="gvShoppingCart_RowCancelingEdit" OnRowDeleting="gvShoppingCart_RowDeleting" OnRowEditing="gvShoppingCart_RowEditing" OnRowUpdating="gvShoppingCart_RowUpdating" ClientIDMode="AutoID">
    <Columns>
        <asp:BoundField DataField="NAME" HeaderText="Product name" ReadOnly="True" />
        <asp:ImageField DataImageUrlField="IMAGE" DataImageUrlFormatString="~\Images\{0}" HeaderText="Image" ReadOnly="True">
        </asp:ImageField>
        <asp:BoundField DataField="PRICE" HeaderText="Price" ReadOnly="True" />
        <asp:BoundField DataField="QUANTITY" HeaderText="Quantity" />
        <asp:TemplateField HeaderText="Total">
            <ItemTemplate>
                <asp:Label ID="Label1" runat="server" Text='<%# Double.Parse(Eval("PRICE").ToString()) * Int32.Parse(Eval("QUANTITY").ToString()) %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField ShowHeader="False">
            <EditItemTemplate>
                <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="True" CommandName="Update" Text="Update"></asp:LinkButton>
                &nbsp;<asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="False" CommandName="Cancel" Text="Cancel"></asp:LinkButton>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False" CommandName="Edit" Text="Edit"></asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:CommandField ShowDeleteButton="True" />
    </Columns>
</asp:GridView>

我通常很擅长寻找答案,但这个问题让我很难过。

点击更新后网站崩溃,因为int quantity = Int32.Parse(txtQuantity.Text); 的返回值是“”,显然你不能从中解析一个int。

关于“ASP.NET验证错误信息更改标签文本”的可能重复标记。我无法找到任何指向答案方向的东西。

【问题讨论】:

  • @DourHighArch 老实说,我还没有真正开始处理异常,我被困在这里,没有进一步行动。
  • 人们在文本框中输入非整数是意料之中的事,而不是例外。用if (!Int32.TryParse(txtQuantity.Text, out quantity))[ShowErrorMessageToUser() 之类的东西来测试它
  • @DourHighArch 我肯定会添加它来处理无效输入,但它对 txtQuantity.Text 返回空字符串没有任何作用。

标签: c# asp.net gridview


【解决方案1】:

Page_PreInit 中致电FillData()。否则,当 ASP.Net 运行时恢复网格的 ViewState 时,包括新的文本框数据,还没有地方可以放置它。请记住,每个服务器事件都使用页面类的全新实例,并且必须从头开始重建整个页面。

【讨论】:

  • 当我从protected void Page_PreInit(object sender, EventArgs e) 调用FillData() 时,我的gridView 仍然为空,所以它会出错。
【解决方案2】:

因为我刚刚学习 ASP.net 和 C#,所以很难弄清楚。

当我能够在之前的任务中完成这项工作时,我并没有使用母版页,但我使用了这个项目。问题在于我在母版页中使用了&lt;form runat="server"&gt; 标记。由于每页只能有一个 &lt;form runat="server"&gt; 标记,因此我的 GridView 没有包含在一个标记中。一旦我删除了母版页并在 GridView 周围添加了 &lt;form runat="server"&gt; 包装器,一切都按预期工作。

【讨论】: