2009-08-26 50 views
0

所以我遇到了一个.aspx页面和一些服务器端代码的问题,我得到了意想不到的结果。C#.Net变量意外重新启动

这个页面的目标很简单,有5个单选按钮和一个带有服务器端onclick函数的按钮。这个想法是用户选择5个单选按钮中的1个,然后点击按钮。点击按钮后,我验证(不使用表单验证,因为我想要一种不同的感觉)检查按钮,然后将选定的选项存储在数据库中。

由于事实单选按钮的数量可能在未来,我决定尝试和单选按钮的抽象数更改为使其更容易在我的自我改变未来。

因此,在我的服务器端代码的顶部,我创建了一个可能的选项列表。

然后我有一个registerVote函数,它在一个单选按钮对象,以及一些抢从配置文件中的设置。我将这两个值放入一个包装类中,然后将它们添加到可能的选项列表中。

最后按下提交按钮的时候,我经历了所有可能的选项进行迭代,看看哪一个被选中,并抓住它的关联值。

public partial class VotePanel : System.Web.UI.Page 
{ 
    List<VoteOption> voteOptions = new List<VoteOption>(); 

    public string registerVote(RadioButton newRadioButton, int voteOption) 
    { 
     voteOptions.Add(new VoteOption(newRadioButton, voteOption)); 
     return ConfigurationManager.AppSettings["vote_option_" + voteOption]; 
    } 

    protected void Submit_Click(object sender, EventArgs e) 
    { 
     //Check vote 
     string vote_value = ""; 
     bool someButtonChecked = false; 

     foreach (VoteOption vo in voteOptions) 
     { 
      if (!someButtonChecked && vo.button.Checked) 
      { 
       vote_value = vo.movie; 
       someButtonChecked = true; 
      } 
     } 
     //.... 
    } 
} 

class VoteOption 
{ 
    public RadioButton button; 
    public int vote_value; 

    public VoteOption(RadioButton r, int v) 
    { 
     button = r; 
     vote_value= v; 
    } 
} 

我在页面中使用的代码添加一个单选按钮,看起来像这样

<的asp:单选按钮ID = “RadioButton1” RUNAT = “服务器” 组名= “投票” 的风格=“的位置是:相对; top:3px;“/> <%= registerMovie(RadioButton1,1)%>

现在为我遇到的问题。每当提交按钮被点击时,列表的计数为零,看起来像已经重新初始化。我通过在registerVote方法中返回列表计数来确认值正在被添加,并且确实正在添加对象,但出于某种原因,提交功能不可用。

现在像这样的页面上的变量不应该重新初始化?我也测试了一个字符串,它没有重置,并且可用于提交按钮。我所做的是定义一个类变量字符串time = DateTime.Now.Ticks.toString();并显示点击提交按钮后,时间总是相同的,无论我点击了多少次。

那么,为什么我的列表将重新初始化,但不是一个字符串?有任何想法吗?

+0

你什么时候打电话给'registerVote'?你可以发布该代码吗? – jscharf 2009-08-26 15:44:57

回答

0

我没有在您的代码中看到您正在构建的列表放置在内存中的任何地方。我相信你正在重新载入每一页。附:可能是我的阅读,但你创建了一个名为registerVote的函数,并且你正在调用一个名为registerMovie的方法,这可能是你的问题。

您可以将列表放置在会话中并从会话中取回。

Personnally我会改变的代码 1)检查列表是在内存中,并得到它。如果不在内存中调用一个方法来生成一次,然后将其放置在内存中。 2)在你的页面上使用一个RadioButtonList,然后你可以绑定到你的列表作为数据源。

1

这个问题似乎是你正在构建列表<VoteOption> voteOptions在页面呈现然后期待它仍然在回发。 Page对象在页面传递给浏览器的时候并不存在,所以当浏览器接收到页面时,您的投票选项列表也会被丢弃。

你要么需要之前或期间Submit_Click重建上回发的voteOption列表,或者给自己的单选按钮,你不需要它的价值足够的信息。

0

asp.net是无状态的,所以每次回传(如点击提交)重新创建服务器端类。如果您希望列表在呼叫之间保持不变,则应将其保存在ViewState或隐藏字段中。不确定的字符串虽然;你所描述的不适合asp.net的生命周期。

2

请记住,您的页面类将针对每个请求构建和销毁 - 每个页面加载之间不会保持状态,您需要根据需要正确重新创建状态。在这种情况下,在调用Submit_Click之前,您的列表voteOptions未被重新创建。

你必须无论页面是否在回发或不注册页面Page_LoadOnInit处理内部,所有的投票选项。这将重建voteOptions,然后将调用Submit_Click时访问。请参阅ASP.NET Page Life Cycle