2011-12-19 3 views
0

У меня есть хрустальный отчет в моем веб-приложении asp.net, в котором много параметров отчета (около 15). Раньше я использовал querystring для их передачи, но он был небезопасным.Как передать несколько параметров кристаллу?

Теперь я сопоставляю все параметры с Hashtable, сохраняя их в сеансе &, переходя к средству просмотра отчетов. Теперь, если пользователь открывает несколько экземпляров отчетов на разных вкладках браузера, значения сеанса перепутаются. При навигации по страницам отображаются неправильные отчеты.

Пожалуйста, сообщите мне хороший способ передать мои параметры для отчета.

Damien.

ответ

1

Как создать простой DTO для хранения всех параметров отчета. Сохраните этот DTO в сеансе и получите доступ на странице просмотра отчетов, где находится ваш контроль зрителя.

Чтобы перейти через сеанс, когда пользователь открывает несколько экземпляров в браузере, вы можете сделать простой трюк. Когда пользователь предоставляет параметр и нажимает «Показать отчет», в этот момент создайте guid, сохраните значение внутри сеанса, используя ключ в качестве этого guid, и передайте это guid как параметр строки запроса на страницу просмотра отчетов. Таким образом, каждый экземпляр страницы просмотра отчетов знает, какое значение сеанса должно быть выведено.

Нечто подобное

public class AttendanceDTO 
{ 
    public int EmployeeId {get;set;} 
    public string Month {get;set;} 
} 

И тогда в вашей "странице параметров отчета"

 /* JUST NOTEPAD CODE, SYNTAX MIGHT VARY */ 
    protected override ShowReport_Click(object sender, EventArgs e) 
      { 
       string guid = new Guid(); 
       AttendanceDTO dto = new AttendanceDTO() 
       { EmployeeId = txtEmployee.Text; 
       Month = txtMonth.text 
      }; 
      session[guid] = dto; 
      Response.Redirect("ReportViewer.aspx?Guid=" + guid); 
      } 

А потом внутри вашего Report Viewer Page

string guid = Request.QueryString["Guid"]; //Null check etc.. 
AttendanceDTO dto = (AttendanceDTO) session[guid]; 
//Provide dto values as parameters to your report viewer control and then clean the session 

[Вы должны были бы сделать убедитесь, что вы очистите соответствующее значение сеанса после его использования.] [ Над кодом находится только блокнот, чтобы дать вам представление. В дополнение к этому вы можете принести больше инноваций]

+0

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

+1

Привет, Damien, я был бы рад, если это вам поможет. Я просто обновил свой ответ на каком-то примере, чтобы дать вам общую идею. –

+0

Спасибо Субаш. То, что я искал, отмечая твое как ответ =) –

1

Объекты сеанса разделяются между несколькими вкладками одного и того же браузера, поскольку сервер хранит только один сеансовый файл cookie для браузера. Таким образом, это довольно очевидно для значений, которые нужно обрабатывать в нескольких вкладках в одном браузере.

Одно из возможных решений: Используйте ViewStates вместо сеанса для хранения HashTable.

См. Приведенный ниже код для демонстрации, я использовал ArrayList вместо HashTable для простоты.

public partial class _Default : System.Web.UI.Page 
{ 
protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     ViewState["ht"] = new ArrayList(); 
     //initialize viewstate with arraylist on first pageload. 
    } 

} 
protected void btnAddElement_Click(object sender, EventArgs e) 
{//adding new elements to the arraylist 
    if (ViewState["ht"] != null) 
    { 
     ArrayList ht = (ArrayList)ViewState["ht"]; 
     ht.Add(TextBox1.Text); 
     ViewState["ht"] = ht; 
    } 
} 
protected void Button2_Click(object sender, EventArgs e) 
{ 
    if (ViewState["ht"] != null) 
    { 
     ArrayList ht=(ArrayList)ViewState["ht"]; 
     foreach (object a in ht) 
     {//write code to pass parameters to the crystal report 
      Response.Write(a); 
     } 
    } 
} 
} 

Поскольку Viewstates работают на уровне страницы, поэтому значения в коллекции не будут испортиться на этот раз.

Надеюсь, это поможет.

+0

Спасибо за подробный ответ Amit. Проблема заключается в том, что мой просмотрщик отчетов находится на другой странице. Пользователь задает некоторые параметры на странице и щелчок «Показать отчет» будет перенаправлен на новую страницу с помощью средства просмотра Crystal Reports. –

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