2014-02-07 2 views
1

До сих пор мы можем передавать форму varialbe в наши отчеты через reportviewer.Как передать значение переменной session в параметр?

Ниже приведен код, действующий в настоящее время.

Markup

<table> 
     <tr> 
      <td align="center" colspan="2"> 
       <asp:Label runat="server" ID="lblUser" Text="Enter UserName" /> 
      </td> 
     </tr> 
     <tr> 
      <td align="center"> 
       UserName:&nbsp;<asp:TextBox runat="server" ID="UserName" Width="75px" /> 
      </td> 
      <td> 
       <asp:Button runat="server" ID="btnGetUser" Text="Print" /> 
      </td> 
     </tr> 
    </table> 

Серверный код:

Sub Run_Report(ByVal sel As String) 
    ReportViewer1.Reset() 
    ReportViewer1.LocalReport.DataSources.Clear() 
    Dim params_user(0) As ReportParameter 


    Select Case which.Value 

     Case "R" 
      ReportViewer1.LocalReport.DataSources.Add(New ReportDataSource("DataSet1", ObjectDataSource1.ID)) 
      ReportViewer1.LocalReport.ReportPath = "GetReceits.rdlc" 
      ReportViewer1.LocalReport.Refresh() 
      ReportViewer1.LocalReport.EnableExternalImages = True 
      params_user(0) = New ReportParameter("UserName", UserName.Text, False) 
      ReportViewer1.LocalReport.SetParameters(params_user) 

    End Select 
End Sub 

Однако из-за соображений безопасности, мы попросили передать переменные сессии, чтобы сообщить.

Таким образом, пользователям не нужно вводить свои имена пользователей, чтобы распечатать отчет.

Я попытался изменить эту строку:

params_user(0) = New ReportParameter("UserName", UserName.Text, False) 

к

params_user(0) = New ReportParameter("UserName", Session("UserName").ToString, False) 

, но когда я попытался запустить его, я получаю:

Object reference not set to an instance of an object. 

Как решить эту проблему?

+0

'Сессия (с) "UserName") 'равно нулю –

ответ

0

Если это работает:

params_user(0) = New ReportParameter("UserName", UserName.Text, False) 

И это бросает NullReferenceException:

params_user(0) = New ReportParameter("UserName", Session("UserName").ToString, False) 

Тогда кажется, что Session("UserName") равна нулю.

два разрешения этой проблемы было бы ни

  1. заполнения Session("UserName") на странице загрузки (если он пуст), или
  2. использование User.Identity.Name в этом вызове (если пользователи уже аутентифицирован в некотором роде) ,

Вариант 1
В коде Page_Load, вы можете сделать это:

If (Session("UserName") Is Nothing) Then 
    Session("UserName") = "the user name" 
End If 

Вариант 2
Если вы аутентификации пользователей уже, вы должны быть в состоянии пройти в Page.User.Identity.Name value:

params_user(0) = New ReportParameter("UserName", User.Identity.Name, False) 
+0

@ jadarney127, привет и спасибо всем за ответ. User.Identity.Name предполагает, что вы прошли аутентификацию через Active Directory, нет? Мы не используем Active Directory. Вариант 1 является жизнеспособным вариантом, но по какой-то причине я по-прежнему получаю ссылку на объект, не установленную на экземпляр объекта. Я создал разметку hiddenField и назвал ее UserHide. Затем я передаю это Uhide как идентификатор управления SelectParameters. '' Как использовать его с решением yuor Option 1? –

+0

@ChidiOkeh Я думаю, что User.Identity.Name заполняется, даже если вы используете аутентификацию по формам (я использовал это раньше). Я обновляю свой ответ для варианта 1 на основе дополнительной информации, которую вы дали сейчас. – jadarnel27

+0

Кстати, @ChidiOkeh, вам нужно изменить свою разметку ControlParameter на 'PropertyName =" Value "' (asp: HiddenField использует свойство Value для хранения информации, а не свойство Text. Имеет ли UserHide имя пользователя в нем когда ваша страница загружается? – jadarnel27

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