gpt4 book ai didi

c# - 在哪里设置变量,以便它们在回发时不为空?

转载 作者:太空宇宙 更新时间:2023-11-03 12:57:24 28 4
gpt4 key购买 nike

我的网页允许用户从可用工具列表中选择一个或多个工具(通过从“可用”列表拖动到“已选择”列表)。有一个 HiddenTools每次两个列表更改时更新的隐藏字段 - <li>ToolsActive列表以逗号分隔的 ID 列表存储在 HiddenTools 中.当用户单击“保存”时,HiddenTools 中的值存储在数据库中。

aspx 页面:

<asp:HiddenField runat="server" ID="HiddenTools"/>

/*<li> can be dragged from one list to the other. Every time the lists
change, HiddenTools gets updated with the contents of ToolsSelected
list, formatted as a comma separated string */

<ul id="ToolsAvailable">
<%foreach (KeyValuePair<int,string> tool in unusedTools){ %>
<li id='<%= tool.Key %>'> <%= tool.Value %> </li>
<% } %>
</ul>

<ul id="ToolsActive">
<%foreach (KeyValuePair<int,string> aTool in selectedTools){ %>
<li id='<%= aTool.Key %>'> <%= tool.Value %> </li>
<% } %>
</ul>

<asp:Button ID="btnSave" OnClick="btnSave_Click" runat="server" Text="Save"/>

代码隐藏:

public partial class Settings
{
protected ToolPreferences prefs;

protected Dictionary<int, string> tools;
protected Dictionary<int, string> unusedTools;
protected Dictionary<int, string> selectedTools;

protected void Page_Load(object sender, EventArgs e)
{
int AccountId = getAccountId();
if(!Page.IsPostBack){
prefs = new ToolPreferences(AccountId);
PopulateTools();
}
}

private void PopulateTools()
{
tools = getPossibleTools();
unusedTools = new Dictionary<int, string>();
selectedTools = new Dictionary<int, string>();

List<int> selectedList = new List<int>();
if (!string.IsNullOrEmpty(prefs.Tools))
{
selectedList = prefs.Tools.Split(',').Select(int.Parse).ToList();
}
foreach (KeyValuePair<int, string> aTool in tools)
{
if (selectedList.Contains(aTool.Key))
{
selectedTools.Add(aTool.Key, aTool.Value);
}
else
{
unusedTools.Add(aTool.Key, aTool.Value);
}
}
}

protected void btnSavePreferences_Click(object sender, EventArgs e)
{
ToolPreferences tp = ToolPreferences (AccountId);
tp.Update(HiddenTools.Value);
}

}

问题是PostBack后出现如下错误:

Object reference not set to an instance of an object.

突出显示以下行:

<%foreach (KeyValuePair<int,string> tool in unusedTools){ %>

如果我将以下两行移出 !PageIsPostBack检查一下,当页面在回发后重新加载时我没有收到该错误,但在页面再次重新加载之前我也看不到用户对工具列表所做的更改。

prefs = new ToolPreferences(AccountId);
PopulateTools();

在哪里可以设置工具变量,以免发生“未设置对象引用”错误?

最佳答案

每个请求都由您的页面类的新实例处理,因此所有实例变量都会被重置(如您所见)。

您希望在请求中保留的值应存储在 ViewState 中(在 this 页面的回发之间存储值)或 Session (保持多个页面之间的值)。

注意:不要将这些值存储在静态变量中。它们确实在回传之间保留它们的值,但也在所有访问者之间共享。

关于c# - 在哪里设置变量,以便它们在回发时不为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33471607/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com