【问题标题】:why the form posted values are not those submitted by users?为什么表单发布的值不是用户提交的?
【发布时间】:2013-11-04 12:06:55
【问题描述】:

我使用 Asp.net 网络表单。我有一个表格和一个组合框。表格随着组合框的选定项目的变化而变化。组合框是一个 asp.net 控件,我设置了 autopostback = true。表格也是一个asp.net控件,所有表格单元格都是在服务器端创建/渲染的。

用户将在表格中输入值并将其提交给服务器。

我发现的问题是,当用户更改组合框的选定项时,表格会更改并且网页会正确呈现。然后用户输入一些值并点击提交。从服务器端,我得到的值是表的默认值,而不是用户输入。如果用户再次提交,服务器端可以获取用户输入。

这是我为重现此问题而编写的代码。我创建了一个默认的 web 表单项目,添加了一个继承站点 master 的新 web。要重现,请执行以下步骤: 1. 选择一个单选按钮 2. 提交,您将在页面顶部看到有关您选择的文本。 3.更改组合框选择 4.选择另一个单选按钮 5.提交,您会发现错误。 6.重做4和5,你会发现文字正确。

 <%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="PostBackUsingMasterPage.aspx.cs" Inherits="WebFormBug.PostBackUsingMasterPage" %>
<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="FeaturedContent" runat="server">
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="MainContent" runat="server">

    <asp:DropDownList ID="comboBox" runat="server" AutoPostBack="true" OnSelectedIndexChanged="UpdateTable">
                <asp:ListItem>Apple</asp:ListItem>
                <asp:ListItem>Beet</asp:ListItem>
                <asp:ListItem>Citron</asp:ListItem>

    </asp:DropDownList>
    <asp:Label ID="userInput" runat="server"></asp:Label>
    <asp:Table runat="server" ID="testTable"> </asp:table>
    <asp:Button ID="submit" runat="server" Text="Submit for validation" OnClick="SubmitButton_Click" />
</asp:Content>

aspx.cs是这样的

using System;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;

namespace WebFormBug
{
    public partial class PostBackUsingMasterPage : Page
    {
        private string _scope; 
        protected void Page_Load(object sender, EventArgs e)
        {
            _scope = comboBox.SelectedValue ?? "Apple";
            PopUpTable(_scope);
        }

        private void PopUpTable(string item)
        {
            testTable.Rows.Clear();
            var row = new TableRow();
            row.Cells.Add(new TableCell {Text = item});
            row.Cells.Add(AddRadioButtons(item));
            testTable.Rows.Add(row);
        }

        private TableCell AddRadioButtons(string name)
        {
            var cell = new TableCell();
            var radioButtons = new HtmlInputRadioButton[5];
            for (var i = 0; i < 3; i++)
            {

                radioButtons[i] = new HtmlInputRadioButton { Name = name, Value = name + " " + i };

                cell.Controls.Add(radioButtons[i]);
                var label = new Label { Text = name + " " + i };
                cell.Controls.Add(label);
            }
            return cell;
        }

        protected void UpdateTable(object sender, EventArgs e)
        {
            PopUpTable(comboBox.SelectedValue);
        }

        protected void SubmitButton_Click(object sender, EventArgs e)
        {
            int valueIndex = 1;
            for (int i = 0; i < testTable.Rows.Count; i++)
            {
                var row = testTable.Rows[i];
                string inputValue = null, inputName = null;
                foreach (var ctrl in row.Cells[valueIndex].Controls)
                {
                    if (ctrl is HtmlInputRadioButton)
                    {
                        var radioInput = (HtmlInputRadioButton) ctrl;
                        if (!radioInput.Checked) continue;
                        inputValue = radioInput.Value;
                        inputName = radioInput.Name;
                        break;
                    }
                }
                if (inputName != null && inputValue != null)
                {
                    userInput.Text = inputName + " " + inputValue;
                }
            }

        }
    }
}

【问题讨论】:

  • 您在哪里创建控件?在 Page_Load,Page_Init?您应该在页面生命周期中尽早创建控件。
  • 如果你能显示一些代码也很好。
  • @JanneMatikainen,表格控件在 .aspx 文件中声明如下:
    。我在 Page_Load 中添加表格单元格。组合框直接在.aspx文件中声明。
  • 将控件添加到 Page_Init 中的表中。
  • @JanneMatikainen 请您看一下我的代码 sn-p 吗?在这种情况下,将控件放入 Page_Init 没有帮助。

标签: asp.net webforms


【解决方案1】:

ASP.NET WebForm的准备知识:表单帖子asp.net table adding rows dynamically don't remain after postback中缺少动态添加的表格数据。您的示例就是这种情况 - 您正在动态组合表格数据。

回发动态表数据的解决方案是在每个回发中重新创建表单数据(并且应该在)页面加载方法中。并且您的示例正在执行此操作(PopUpTable 方法始终在 Page_Load 中调用)。

但是,在您的代码中 Page_Load 不是唯一进行表重新创建的地方,而且在 OnSelectedIndexChanged 中也会导致清理您的表数据。其实你不需要注册这个事件。

所以,解决方案(很抱歉将代码附加为图像,但我发现附加大段代码很难格式化):

  1. 删除OnSelectedIndexChanged
  2. 修改后面的代码如下:

【讨论】:

    【解决方案2】:

    试试这个:
    在页面加载中:

    if(!IsPostBack)
    {
        // set data to table
    }
    

    【讨论】:

    • 呃...不要告诉我你真的比较布尔值和 == false。
    • 谢谢@SamieyMehdi,我试过了,但不适用于我的情况。
    • 每次页面加载都要渲染动态创建的控件
    【解决方案3】:

    我假设您有更新面板,下拉列表中所选索引的更改会更新单选按钮。您可以尝试将下拉菜单的事件处理程序更改为

    protected void UpdateTable(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            PopUpTable(comboBox.SelectedValue);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-16
      • 2014-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 2014-04-30
      相关资源
      最近更新 更多