【问题标题】:C# .Net variable unexpected re-initialationC# .Net 变量意外重新初始化
【发布时间】:2009-08-26 15:29:19
【问题描述】:

所以我遇到了一个 .aspx 页面和一些服务器端代码的问题,我得到了意想不到的结果。

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

由于单选按钮的数量将来可能会发生变化,我决定尝试抽象出单选按钮的数量,以便我自己在将来更容易更改。

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

然后我有一个 registerVote 函数,它接收一个 RadioButton 对象,以及一个从配置文件中获取设置的数字。我将这两个值放入一个包装类中,然后将它们添加到可能的选项列表中。

最后,当提交按钮被按下时,我会遍历所有可能的选项以查看哪个选项被选中,并获取其相关值。

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;
    }
}

我在页面中用于添加单选按钮的代码如下所示

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

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

那么为什么我的 List 会重新初始化,而不是字符串?有什么想法吗?

【问题讨论】:

  • 你什么时候打电话给'registerVote'?你能把那个代码贴出来吗?

标签: c# .net variables


【解决方案1】:

请记住,您的页面类将针对每个请求构建和销毁 - 在每次页面加载之间不会维护任何状态,您可以根据需要正确地重新创建状态。在这种情况下,您的列表 voteOptions 在调用 Submit_Click 之前似乎没有被重新创建。

无论页面是否在回发中,您都必须注册所有投票选项。这将重构voteOptions,然后在调用Submit_Click 时访问它。

看看ASP.NET Page Life Cycle

【讨论】:

    【解决方案2】:

    问题似乎是您在页面渲染时构建 List voteOptions 然后期望它在回发时仍然存在。 Page 对象在页面传递给浏览器之后不存在,因此当浏览器收到页面时,您的投票选项列表也会被处理掉。

    您需要在回发的 Submit_Click 之前或期间重建 voteOption 列表,或者在您不需要的单选按钮的值中为自己提供足够的信息。

    【讨论】:

      【解决方案3】:

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

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

      我个人会将代码更改为 1)检查列表是否在内存中并获取它。如果不在内存中,则调用一个方法生成一次,然后将其放入内存中。 2) 在您的页面上使用 RadioButtonList,然后您可以将其作为数据源绑定到您的列表。

      【讨论】:

        【解决方案4】:

        asp.net 是无状态的,因此每次回发(例如单击提交)都会重新创建服务器端类。如果您希望您的列表在调用之间保持不变,则应将其保存在 ViewState 或 Hidden 字段中。不过不确定字符串;您所描述的内容不适合 asp.net 生命周期。

        【讨论】:

          猜你喜欢
          • 2015-07-18
          • 1970-01-01
          • 1970-01-01
          • 2018-08-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-21
          相关资源
          最近更新 更多