【问题标题】:List.count always resetting to 0 after adding element添加元素后 List.count 总是重置为 0
【发布时间】:2013-07-16 15:38:48
【问题描述】:

我正在使用 Visual Studio 2010 创建一个 Web 表单,并且我有一个 .aspx 页面,它可以获取一些用户输入并将其保存到数据库中。页面上有两个按钮,一个用于用户“保存”值(应在此处添加到列表中),第二个用于将它们以正确的格式实际保存到数据库中。我的代码如下:

namespace TabletApplication.HomePages
{
    public partial class Record : System.Web.UI.Page
    {
        List<ReadingModel> paramList;

        protected void Page_Load(object sender, EventArgs e)
        {
            paramList = new List<ReadingModel>();
        }



        public class ReadingModel
        {
            public int paramId { get; set; }
            public string value { get; set; }
            public Boolean pass { get; set; }
            public string comment { get; set; }
        }

        protected void btnUpdate_Click(object sender, EventArgs e)
        {
            // Get an instance of the Button
            Button UpdateButton = (Button)sender;
            // Get the ID of the current record from the CommandArgument
            int intID = Convert.ToInt32(UpdateButton.CommandArgument);
            bool goodValue;
            using (TabletApplicationEntities serverContext = new TabletApplicationEntities())
            {
                // Get the value and comment
                TextBox Reading =
                    (TextBox)UpdateButton.Parent.FindControl("txtReading");
                TextBox Comment =
                    (TextBox)UpdateButton.Parent.FindControl("txtComment");

                //Get min and max values
                Label Min = (Label)UpdateButton.Parent.FindControl("minValLabel");
                Label Max = (Label)UpdateButton.Parent.FindControl("maxValLabel");
                double minVal = Convert.ToDouble(Min.Text);
                double maxVal = Convert.ToDouble(Max.Text);
                int readingVal = -1;

                try
                {
                    readingVal = Convert.ToInt32(Reading.Text);
                    goodValue = true;
                }
                catch
                {
                    Reading.Text = "Invalid entry: Must enter a number";
                    Reading.BackColor = System.Drawing.Color.Red;
                    Reading.ForeColor = System.Drawing.Color.Blue;
                    goodValue = false;
                }

                if (goodValue)
                {
                    // Update the record
                    ReadingModel Result = new ReadingModel();
                    Result.comment = Comment.Text;
                    Result.value = Reading.Text;
                    Result.paramId = intID;
                    if (readingVal > minVal && readingVal < maxVal && readingVal >= 0)
                    {
                        Result.pass = true;
                    }
                    else if (readingVal < minVal || readingVal > maxVal)
                    {
                        Result.pass = false;
                    }
                    else
                    {
                        Reading.Text = "UNKNOWN ERROR: Try again";
                        Reading.BackColor = System.Drawing.Color.Red;
                        Reading.ForeColor = System.Drawing.Color.Blue;
                    }
                    paramList.Count();
                    paramList.Add(Result);
                    paramList.Count();
                }
            }
        }

        protected void btnSubmit_Click(object sender, EventArgs e)
        {
            using (TabletApplicationEntities serverContext = new TabletApplicationEntities())
            {
                // Create a new Reading
                foreach (var para in paramList)
                {
                    Reading objReading = new Reading();
                    // Set values
                    objReading.ParamID = para.paramId;
                    objReading.comment = para.comment;
                    objReading.date = System.DateTime.Now;
                    objReading.pass = para.pass;
                    objReading.reading1 = para.value;

                    // Add object
                    serverContext.Readings.AddObject(objReading);
                }

                // Save changes
                serverContext.SaveChanges();
                paramList.Clear();
            }
        }
    }
}

当用户点击第一个按钮时,btnUpdate_Click 函数正常运行,并将新的Result 添加到paramList。在两个paramList.Count() 上设置断点,我可以看到在添加结果之前计数为 0,之后为 1,就像它应该的那样。但是,当按下保存按钮时,btnSubmit_Click 函数运行并完全跳过 for 循环,因为 paramList 的计数再次为 0。有什么想法吗?

编辑 1:

我尝试将 ViewState 添加到 Page_Load,但我认为它不起作用,因为 List 不是“可序列化的”,但我不知道如何修复它。这是我添加的:

List<ReadingModel> paramList;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (ViewState["paramList"] != null)
            {
                paramList = (List<ReadingModel>)ViewState["paramList"];
            }
            else
            {
                paramList = new List<ReadingModel>();
            }
        }

【问题讨论】:

  • 提示:为每个请求创建页面
  • 因此,我发现的选项是将对象放入当前用户的会话中,这似乎并不理想,或者使用视图状态。视图状态似乎是要走的路,但我对这样的事情很陌生。我将如何实现这样的事情?

标签: c# asp.net list properties webforms


【解决方案1】:

paramsList 需要在回发之间持久化。您可以将列表存储在 Session 或 ViewState 中。这样做可以让它比请求的寿命更长。

你可以在你的页面上创建一个类似的属性(未测试):

public List<ReadingModel> paramsList
{
    get 
    {
        if(ViewState["paramsList"] == null)
            ViewState["paramsList"] = new List<ReadingModel>();

        return ViewState["paramsList"] as List<ReadingModel>;
    }
    set 
    {
         ViewState["paramsList"] = value;
    }
}

【讨论】:

  • 您的回答提供了另一种不会工作的方式,有什么意义?这实际上是无关紧要的,也不是答案。
  • 我试过了,你说得对,它没有用。这是我在将结果添加到列表的行中遇到的错误:“异常详细信息:System.NullReferenceException:对象引用未设置为对象的实例。”
【解决方案2】:

paramList 是页面上的私有变量,每当页面回发时都会重置。为了在回发中保留 paramList,您需要将其存储在会话变量中。所以改变:

 paramList.Add(Result);

到:

  ((List<ReadingModel>)Session["paramList"]).Add(Result)

【讨论】:

    【解决方案3】:

    您可以像这样将会话封装在公共属性中:

    public List<string> paramList 
        {
            get
            {                
                if (Session["paramList"] != null)
                {
                    return (List<string>)Session["paramList"];
                }
                else
                {
                Session["paramList"] = new List<string>();
                return (List<string>)Session["paramList"];
                }
         }                
            set { Session["paramList"] = value; }
        }
    

    当您单击按钮时,值将添加到此列表中,可通过公共属性访问。当页面进行回发时,添加到列表中的值不会被删除。

        protected void Button1_Click(object sender, EventArgs e)
        {
            paramList.Add("test");
        }
    

    (我以字符串列表为例,但我假设你明白了)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 2016-01-08
      • 1970-01-01
      • 2015-07-16
      • 1970-01-01
      • 2016-08-15
      • 2011-05-21
      相关资源
      最近更新 更多