我使用Asp.net网络表单。我有一个表格和一个组合框。表格随着组合框的选定项目的更改而更改。组合框是一个asp.net控件,我设置autopostback = true。该表也是一个asp.net控件,所有表格单元格都在服务器端创建/呈现。
用户将在表格中输入值并将其提交给服务器。
我发现的问题是,当用户更改组合框的选定项目时,表格会更改并正确呈现网页。然后用户输入一些值并单击提交。从服务器端,我得到的值是表的默认值,而不是用户输入。如果用户再次提交,服务器端可以获得用户输入。
以下是我为重现此问题而编写的代码。我创建了一个默认的Web表单项目,添加了一个继承站点主站的新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;
}
}
}
}
}
答案 0 :(得分:1)
试试这个:
在页面加载:
if(!IsPostBack)
{
// set data to table
}
答案 1 :(得分:1)
准备知识:表单asp.net table adding rows dynamically don't remain after postback中缺少动态添加的表数据。你的样本是这样的 - 你正在动态地组合表数据。
回发动态表数据的解决方案是重新创建每个帖子中的表单数据(并且应该仅>)页面加载方法。并且您的示例正在执行此操作(始终在PopUpTable
)中调用Page_Load
方法。
但是,在您的代码Page_Load
中,OnSelectedIndexChanged
并不是唯一可以重新创建表格的地方,而且OnSelectedIndexChanged
也会导致清理表格数据。实际上,您不需要注册此事件。
所以,解决方案(抱歉将代码附加为图片,但我发现附加大段代码很难格式化):
答案 2 :(得分:0)
我假设您有更新面板,下拉列表中所选索引的更改会更新radiobuttons。您可以尝试将下拉列表的事件处理程序更改为
protected void UpdateTable(object sender, EventArgs e)
{
if (!IsPostBack)
{
PopUpTable(comboBox.SelectedValue);
}
}