我正在使用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>();
}
}
答案 0 :(得分:2)
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;
}
}
答案 1 :(得分:1)
paramList是页面上的私有变量,每当页面回发时都会重置。为了在回发上保留paramList,您需要将其存储在会话变量中。所以改变:
paramList.Add(Result);
为:
((List<ReadingModel>)Session["paramList"]).Add(Result)
答案 2 :(得分:0)
您可以将会话封装在公共属性中,如下所示:
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");
}
(我使用字符串列表作为示例,但我假设您明白了这一点)