2012-04-26 3 views
0

Я хотел получить лучший подход к тому, что я пытаюсь сделать. У меня есть sproc в базе данных, которая импортирует из другой базы данных в нашу и связывает информацию. Если отсутствует связанная информация, он генерирует ошибки ro, которые разрешает пользователь. В моем коде, я получаю эти ошибки, я создаю таблицу html, добавляя строки для каждой ошибки. Теперь я хочу сохранить эту информацию на нескольких страницах, поэтому я храню это в сеансе, так как это всего лишь таблица html, а не простой режим работы, например сетка, лучший способ: хранить таблицу HTML в сеансе или любым другим способом и как я могу получить доступ к этому в Javascript или Jquery на стороне клиента, так что я могу использовать функции JQuery, чтобы показать расширяемой DIV отображения этой информацииДоступ к таблице html, хранящейся в сеансе

protected void BtnAddDock1_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      HtmlGenericControl RadDocksDiv = (HtmlGenericControl)Master.FindControl("RadDocksDiv"); 
      RadDocksDiv.Style["display"] = "block"; 

      Session["Docking"] = "Open"; 

      Table tblErrors = new Table(); 
      tblErrors.ID = "tblErrors"; 
      tblErrors.CssClass = "tabularData"; 
      tblErrors.Width = 800; 
      TableHeaderRow hr = new TableHeaderRow(); 
      // hr.ID = "tblErrorsHeaderRow"; 
      TableHeaderCell thc = new TableHeaderCell(); 
      //thc.ID = "tblErrorsHeaderCell"; 
      thc.Text = "Error Descriptions"; 
      hr.Cells.Add(thc); 
      tblErrors.Rows.Add(hr); 
      Panel pnlErrors = (Panel)Master.FindControl("pnlErrors"); 

      Table dobleTable = (Table)Master.FindControl("tblErrors"); 

      if (dobleTable == null) 
      { 
       pnlErrors.Controls.Add(tblErrors); 



       for (int i = 0; i < 10; i++) 
       { 
        TableRow tableRow = new TableRow(); 
        string error = "This is a website generated Import Error that needs to be added to the panel on Masterpage!"; 
        TableCell tableCell = new TableCell(); 
        tableCell.Text = error; 
        tableRow.Cells.Add(tableCell); 
        tblErrors.Rows.Add(tableRow); 
       } 


       Session["ErrorsTable"] = tblErrors; 
      } 
      //Table tblErrors = (Table)Master.FindControl("tblErrors"); 


     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 

и вот как я пытаюсь получить это в JavaScript, но все, что я может видеть только System.Web.UI.WebControls.Table, когда я пытаюсь получить его из сеанса.

//Access html table in session 
    var dockingState = '<%= Session["Docking"] %>' 

    if (dockingState == "Open") { 

     // This doesnt return the html table correctly?!? 
     var sessiontblErrors = '<%= Session["ErrorsTable"] %>' 

     if (sessiontblErrors != null) { 
      var pnlErrors = $("[id$=pnlErrors]"); 

     } 
    } 

ответ

3

Если вы действительно хотите сохранить ошибки в сессии, чтобы показать, и на других страницах, я хотел бы сделать это таким образом , Вместо создания таблицы HTML и сохранения в сеансе я создавал бы список Ошибок в сеансе и получал бы доступ к нему всякий раз, когда мне это нужно, и отображать его в любом формате, который я хочу. Это может быть HTML таблица, Упорядоченный список, Пролеты и т.д ...

Я бы просто создать класс для хранения своих сообщений об ошибках

public class ErrorMessage 
{ 
    public string ErrorCode { set;get;} 
    public string Message { set;get;} 
} 

и в вашем коде, вместо создания строки HTML таблицы, я добавлю это в список

List<ErrorMessage> objErrorList=new List<ErrorMessage>(); 

for(int i = 0; i < 10; i++) 
{ 
    ErrorMessage objError=new ErrorMessage(); 
    objError.ErrorCode=5020; 
    objError.Message="There is such a bad error!"; 
    objErrorList.Add(objError); 
} 
if(objErrorList.Count>0) 
{ 
    Session["Errors"]=objErrorList; 
} 

И всякий раз, когда я хочу этого, я верну его с сеанса. Я бы обернул это функцией.

public List<ErrorMessage> GetErrors() 
{ 
    List<ErrorMessage> objList=new List<ErrorMessage>(); 
    if(Session["Errors"]!=null) 
    { 
    objList=(List<ErrorMessage>)Session["Errors"]; 
    } 
    return objList; 
} 

Если вы хотите, чтобы это с JavaScript, вы можете получить его, сделав вызов на странице сервера (ASPX страница/обработчика ASHX) с помощью JQuery Ajax/getJson. Что-то вроде этого.

var strErrors="<ul>"; 
$.getJSON('geterrors.ashx', function(data) { 
    $.each(data, function(key, val) { 
     strErrors+="<li>" + val + "</li>"; 
    }); 
}); 
strErrors+="</ul>"; 

$("#yourMsgDiv").html(strErrors); 

Где в geterrors.ashx, вы будете называть наш метод GetErrors и конвертировать этот формат toJSon и вернуться.

Основным преимуществом в этом подходе является то, что Презентация не плотно связана с данными. Мы можем показать сообщение об ошибке в разных стилях.

+0

Привет, Shyju Спасибо за хорошее предложение, я пытаюсь это сделать, havnt работал с обработчиками ashx, попробовал Json с вызовом webservice, но я не получаю никаких данных обратно в Javascript, вот что у меня есть в Services.asmx – Shokwave

+0

@ Shokwave: Я рекомендую вам задать еще один вопрос для этого с соответствующими деталями. Поэтому люди помогут вам. – Shyju

+0

@Shokwave: используйте firebug/fiddler, чтобы узнать, какие вызовы сделаны и какой ответ возвращается. – Shyju

0

Прочтите следующие ссылки, и у вас будет идея, что использовать. Сессия - это дорогостоящая операция с точки зрения памяти, и если у вас большой веб-сайт большого объема, это будет большой проблемой.

http://msdn.microsoft.com/en-us/library/75x4ha6s.aspx

http://msdn.microsoft.com/en-us/library/z1hkazw7.aspx

http://www.c-sharpcorner.com/UploadFile/freelance91/ASPNETstatemanagementtechniques01012007212655PM/ASPNETstatemanagementtechniques.aspx

http://www.dotnetfunda.com/articles/article61.aspx

http://www.codeproject.com/Articles/31994/Beginners-Introduction-to-State-Management-Techniq

0

Прежде всего, здесь существует большое недоразумение.

Session хранит сериализованные строковые представления объекты.

Session["ErrorsTable"] = tblErrors; 

Это очень важно, чтобы вы поняли, что tblErrors в вашей C# код не равен:

<table><tr><td>...</td></tr></table> 

tblErrors является объектом, и у него есть класс, так же как и любой другой C# класс , (перефразируя) Когда страница отображается asp.net для отправки клиенту, этот класс переведен как html. Однако, если вы поместите экземпляр класса в Session, это не то, что вы получите. Вы храните фактический объект, который Session сериализует и десериализует для вас.

Надеюсь, это поможет, я понимаю, что это трудная тема для объяснения.

1

создать HTML таблицу Добавление строк для каждой ошибки

На самом деле эта линия Table tblErrors = new Table(); создает System.Web.UI.WebControls.Table, который является элемент управления на стороне сервера ASP.NET.

Если вы действительно хотите создать таблицу HTML, вам нужно будет использовать метод Render для генерации HTML. Я сказал, что вы должны сделать то, что Shyju рекомендует и удаляет презентацию из данных.

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