在哪里设置变量,以便它们在回发时不为空?
Where to set variables so that they aren't null on postback?
我的网页允许用户 select 可用工具列表中的一个或多个工具(通过从 "available" 列表拖动到 "selected" 列表)。有一个 HiddenTools
隐藏字段,每次两个列表更改时都会更新 - ToolsActive
列表中的 <li>
在 HiddenTools
中存储为逗号分隔的 ID 列表.当用户点击"Save"时,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);
}
}
问题是回发后出现如下错误:
Object reference not set to an instance of an object.
突出显示以下行:
<%foreach (KeyValuePair<int,string> tool in unusedTools){ %>
如果我将以下两行移出 !PageIsPostBack
检查,回发后重新加载页面时我不会收到该错误,但我也看不到用户对工具列表,直到下次重新加载页面。
prefs = new ToolPreferences(AccountId);
PopulateTools();
我在哪里可以设置工具变量,这样 "Object reference not set" 错误就不会发生?
我的网页允许用户 select 可用工具列表中的一个或多个工具(通过从 "available" 列表拖动到 "selected" 列表)。有一个 HiddenTools
隐藏字段,每次两个列表更改时都会更新 - ToolsActive
列表中的 <li>
在 HiddenTools
中存储为逗号分隔的 ID 列表.当用户点击"Save"时,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);
}
}
问题是回发后出现如下错误:
Object reference not set to an instance of an object.
突出显示以下行:
<%foreach (KeyValuePair<int,string> tool in unusedTools){ %>
如果我将以下两行移出 !PageIsPostBack
检查,回发后重新加载页面时我不会收到该错误,但我也看不到用户对工具列表,直到下次重新加载页面。
prefs = new ToolPreferences(AccountId);
PopulateTools();
我在哪里可以设置工具变量,这样 "Object reference not set" 错误就不会发生?