2013-07-16 3 views
-1

Я создаю веб-форму с помощью Visual Studio 2010, и у меня есть страница .aspx, которая захватывает некоторые пользовательские данные и сохраняет их в базе данных. На странице есть две кнопки, одна для пользователя для сохранения значений (должна быть добавлена ​​в список здесь), а вторая - для фактического сохранения их в базе данных в соответствующем формате. Мой код ниже:List.count всегда сбрасывается до 0 после добавления элемента

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. Есть идеи?

EDIT 1:

Я попытался добавить ViewState в Page_Load, но я считаю, что это не работает, потому что список не является «serializeable», но я не знаю, как это исправить. Это то, что я добавил:

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>(); 
      } 
     } 
+2

подсказки: страница создается для каждого запроса –

+0

Так от этого, вариант я найденные помещают объекты в сеанс для текущего пользователя, что не кажется идеальным, или использовать viewstate. Представление выглядит как способ пойти, но я очень новичок в таких вещах. Как мне реализовать что-то подобное? – user2569124

ответ

2

paramsList необходимо сохранить между обратными передачами. Вы можете сохранить список в сеансе или в 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; 
    } 
} 
+2

Ваш ответ дает просто другой способ, которым это не работает, в чем смысл? Это действительно практически не имеет значения, а не ответ. –

+0

Я пробовал это, и ты был прав, это не сработало. Это ошибка, которую я получил в строке, где результат добавляется в список: «Сведения об исключении: System.NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта». – user2569124

1

paramList является частной переменной на странице будет сбросить каждый раз, когда страница отправляется обратно. Чтобы перенести paramList на postback, вам нужно сохранить его в переменной сеанса. Меняем:

paramList.Add(Result); 

к:

((List<ReadingModel>)Session["paramList"]).Add(Result) 
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"); 
    } 

(я использую список строк в качестве примера, но я предполагаю, что вы получите идею)

Смежные вопросы