c#asp web应用中视图状态下动态元素表的存储/恢复
我对具有动态内容的web应用程序的概念很陌生。 我正在创建一个简单的应用程序,它从数据库中获取信息(测试步骤),并将行添加到表中(每行包含两个标签、两个单选按钮和文本字段) 它的工作原理如下: 1.我有一个带有文本框和按钮的页面, 2.我输入测试ID来检索测试步骤,然后单击submit按钮 3.根据步骤数,我为每个步骤向表中添加一行,因此我的表如下所示:c#asp web应用中视图状态下动态元素表的存储/恢复,c#,asp.net,C#,Asp.net,我对具有动态内容的web应用程序的概念很陌生。 我正在创建一个简单的应用程序,它从数据库中获取信息(测试步骤),并将行添加到表中(每行包含两个标签、两个单选按钮和文本字段) 它的工作原理如下: 1.我有一个带有文本框和按钮的页面, 2.我输入测试ID来检索测试步骤,然后单击submit按钮 3.根据步骤数,我为每个步骤向表中添加一行,因此我的表如下所示: [Label.text="Step1"][RadioButtonPass][RadioButtonFail][Label.Text="Comm
[Label.text="Step1"][RadioButtonPass][RadioButtonFail][Label.Text="Comment:"][TextBox]
[Label.text="Step2"][RadioButtonPass][RadioButtonFail][Label.Text="Comment:"][TextBox]
[Label.text="Step3"][RadioButtonPass][RadioButtonFail][Label.Text="Comment:"][TextBox]
etc.
ViewState[table.ID] = table;
在PopulateTable方法的末尾,然后在
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
if (ViewState[TableForMethods.ID] != null)
{
TableForMethods = (Table)ViewState[TableForMethods.ID];
}
}
}
但这不起作用
我的代码如下所示:
[Label.text="Step1"][RadioButtonPass][RadioButtonFail][Label.Text="Comment:"][TextBox]
[Label.text="Step2"][RadioButtonPass][RadioButtonFail][Label.Text="Comment:"][TextBox]
[Label.text="Step3"][RadioButtonPass][RadioButtonFail][Label.Text="Comment:"][TextBox]
etc.
*.aspx
<body style="height: 510px">
<form id="form1" runat="server">
<p>
Put test case ID and submit
</p>
<asp:TextBox ID="TextBoxId" runat="server">1804673290</asp:TextBox>
<asp:Button ID="ButtonRetriveId" runat="server" OnClick="ButtonSubmitId_Click" Text="Submit" Width="81px" />
<p>
</p>
<p>
<asp:Label ID="LabelMethods" runat="server"></asp:Label>
</p>
<p>
<asp:Table ID="TableForMethods" runat="server">
</asp:Table>
</p>
<div style="text-align: right">
<asp:Button ID="ButtonSubmitResults" runat="server" Text="Submit result" OnClick="ButtonSubmitResults_Click" Visible="False" />
</div>
<div style="text-align: right; position: absolute; bottom: 0px">
<asp:Label ID="LabelStatus" runat="server"></asp:Label>
</div>
</form>
<script>
var trPassArray = $("tr input[id*='RadioButtonPass']").click(function () {
this.closest("tr").setAttribute("bgcolor", "yellowgreen");
console.log("zmien na green");
console.log(closest("tr"));
});
var trFailArray = $("tr input[id*='RadioButtonFail']").click(function() {
this.closest("tr").setAttribute("bgcolor", "orangered");
console.log("zmien na red");
console.log(this.closest("tr"));
});
console.log(trPassArray);
console.log(trFailArray);
</script>
</body>
放置测试用例ID并提交
1804673290
var trPassArray=$(“tr输入[id*='RadioButtonPass'])。单击(函数(){
这个.trest(“tr”).setAttribute(“bgcolor”、“黄绿色”);
console.log(“zmien na green”);
控制台日志(最近的(“tr”);
});
var trFailArray=$(“tr输入[id*='RadioButtonFail'])。单击(函数(){
这个.recest(“tr”).setAttribute(“bgcolor”、“oranged”);
console.log(“zmien na red”);
console.log(this.closest(“tr”));
});
控制台日志(trPassArray);
console.log(trFailArray);
*.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
}
protected void ButtonSubmitId_Click(object sender, EventArgs e)
{
this.PopulateTable(TableForMethods, value);
ButtonSubmitResults.Visible = true;
}
protected void ButtonSubmitResults_Click(object sender, EventArgs e)
{
}
private void PopulateTable(Table table, string value)
{
string[] sep = { "<br>" };
var words = value.Split(sep, StringSplitOptions.RemoveEmptyEntries);
for (int iterator = 1; iterator <= words.Count(); iterator++)
{
var tRow = new TableRow { ID = "Row" + iterator };
table.Rows.Add(tRow);
var tCell = new TableCell();
var myLabel = new Label
{
Text = words[iterator - 1],
ID = "Label " + iterator
};
var radiobuttonPass = new RadioButton
{
Text = "Pass ",
ID = "RadioButtonPass " + iterator,
GroupName = "passFailGroup" + iterator,
};
radiobuttonPass.CheckedChanged += passRadioButton_CheckedChanged;
var radiobuttonFail = new RadioButton
{
Text = "Fail ",
ID = "RadioButtonFail " + iterator,
GroupName = "passFailGroup" + iterator,
};
radiobuttonFail.CheckedChanged += failRadioButton_CheckedChanged;
var upPassFail = new UpdatePanel { UpdateMode = UpdatePanelUpdateMode.Conditional };
upPassFail.ContentTemplateContainer.Controls.Add(radiobuttonPass);
upPassFail.ContentTemplateContainer.Controls.Add(radiobuttonFail);
var passTrigger = new AsyncPostBackTrigger
{
ControlID = radiobuttonPass.ID,
EventName = "CheckedChanged"
};
upPassFail.Triggers.Add(passTrigger);
var failTrigger = new AsyncPostBackTrigger
{
ControlID = radiobuttonFail.ID,
EventName = "CheckedChanged"
};
upPassFail.Triggers.Add(failTrigger);
var labelComment = new Label
{
Text = " Comment:",
ID = "LabelComment " + iterator.ToString()
};
TextBox textBoxComment = new TextBox { ID = "TextBoxComment " + iterator.ToString() };
tCell.Controls.Add(myLabel);
tCell.Controls.Add(radiobuttonPass);
tCell.Controls.Add(radiobuttonFail);
tCell.Controls.Add(labelComment);
tCell.Controls.Add(textBoxComment);
tRow.Cells.Add(tCell);
}
}
受保护的无效页面加载(对象发送方,事件参数e)
{
}
受保护的无效按钮提交单击(对象发送者,事件参数e)
{
this.PopulateTable(TableFormMethods,value);
ButtonsSubmitResults.Visible=true;
}
受保护的无效按钮提交结果\u单击(对象发送方,事件参数e)
{
}
私有void PopulateTable(表、字符串值)
{
字符串[]sep={“
”};
var words=value.Split(sep,StringSplitOptions.RemoveEmptyEntries);
for(int iterator=1;iterator您尝试执行的操作无效。ViewState
由服务器应用程序用于在请求之间存储信息
- 在页面加载或回发过程中,服务器修改页面或其控件的状态
- 当你回帖时,如果没有办法“记住”所做的事情,所有这些更改都将丢失。这就像是第一次加载页面一样
- ASP.NET通过在表单字段(
ViewState
)中写入控件的详细信息来解决此问题。这样,每次回发时,您都会将数据发送回服务器,告诉服务器页面和控件的状态,以便它可以重新创建
您正在对客户端上的HTML进行更改。此时页面已呈现,包括ViewState
。它只跟踪服务器的更改,而不跟踪客户端上发生的任何更改。因此服务器永远不会知道这些更改发生了
有几种方法可以解决这个问题(不止两种,但这些都是显而易见的)
无论修改该表需要做什么更改,都要在服务器上进行。如果用户与某个对象交互,请向服务器回发。服务器修改该表,并且假设为该表启用了ViewState
,则这些更改已写入ViewState
,并将其持久化
避免回发。如果没有服务器控件,那么在页面加载后,它的行为就像普通的HTML页面一样,您可以在客户端执行任何您想要的操作
这有点混乱:在客户端上存储客户端更改。当您在客户端上更新表时,您可以将其存储在localStorage
中。当页面刷新时,您可以使用客户端脚本检查localStorage
并恢复存储在那里的任何客户端内容。将其视为与一样de>ViewState
,但恰恰相反。ViewState
在往返之间存储服务器端数据。localStorage
在往返之间存储客户端数据。问题是,在某些回发上,您可能会完全更改表(如新数据或其他内容)您必须有一种方法来区分它,以便在这种情况下,您不会从localStorage
刷新它
将WebForms与客户端代码混合在一起可能有点令人沮丧。我们开始学习所有这些整洁的客户端工具,但它们并不总是能很好地处理WebForms的行为。客户端代码希望更改页面上的内容。WebForms希望刷新整个页面
就我个人而言,如果可能的话,我会选择选项1或选项2,而不是尝试交叉繁殖两者的行为。嗨,谢谢你的详细回答,选项1看起来最好。我该怎么做?我在PopulateTable方法的末尾添加了ViewState[table.ID]=table,但更改不是持久的,我这样做正确吗?什么是“加载”状态的正确方法?