Report processing actions are sent in an Ajax request to exchange data with the Web API service. You can handle post actions event to customize the Ajax requests.
AjaxBeforeLoad
AjaxSuccess
AjaxError
This event can be triggered before an Ajax request is sent to the Report Viewer Web API service. It allows you to set additional headers and custom data in the Ajax request. The following code sample demonstrates adding custom authorization header and passing default parameter values to service.
Initialize the ajaxBeforeLoad
event in the script and add the authorization token to the headers
property.
<bold-reportviewer id="reportViewer_Control"
[reportServiceUrl] = "serviceUrl"
[processingMode] = "Remote"
[reportServerUrl] = "serverUrl"
[reportPath] = "reportPath"
(ajaxBeforeLoad) = "onAjaxRequest($event)">
</bold-reportviewer>
import { Component, ViewChild } from '@angular/core';
import { BoldReportsAngularModule } from '@boldreports/angular-reporting-components/src/core';
@Component({
selector: 'ej-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
public serviceUrl: string;
public reportPath: string;
public serverUrl: string;
constructor() {
this.serviceUrl = 'https://demos.boldreports.com/services/api/ReportApi';
this.reportPath = 'Sales Order Detail.rdl';
}
onAjaxRequest(event) {
event.headers.push({ Key: 'Authorization', Value: 'demo@123' });
}
}
In this tutorial, the
Sales Order Detail.rdl
report is used, and it can be downloaded from here.
Get the custom header value from the HttpContext
header collection using the key name specified at client side.
string authenticationHeader;
public object PostReportAction(Dictionary<string, object> jsonResult)
{
if (jsonResult != null)
{
//Get client side custom ajax header and store in local variable
authenticationHeader = HttpContext.Current.Request.Headers["Authorization"];
//Perform your custom validation here
if (authenticationHeader == "")
{
return new Exception("Authentication failed!!!");
}
else
{
return ReportHelper.ProcessReport(jsonResult, this);
}
}
return null;
}
Perform your own action to validate the header values.
Use the data
property to set custom data to the server in the Ajax request. In the following code sample, parameter values are passed to the server side.
<bold-reportviewer id="reportViewer_Control"
[reportServiceUrl] = "serviceUrl"
[processingMode] = "Remote"
[reportServerUrl] = "serverUrl"
[reportPath] = "reportPath"
(ajaxBeforeLoad) = "onAjaxRequest($event)">
</bold-reportviewer>
import { Component, ViewChild } from '@angular/core';
import { BoldReportsAngularModule } from '@boldreports/angular-reporting-components/src/core';
@Component({
selector: 'ej-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
public serviceUrl: string;
public reportPath: string;
public serverUrl: string;
constructor() {
this.serviceUrl = 'https://demos.boldreports.com/services/api/ReportApi';
this.reportPath = 'Sales Order Detail.rdl';
}
onAjaxRequest(event) {
//Passing custom data to server
var customerID = "CI0021";
event.data = customerID;
}
}
The custom data values are stored in the customData
header key, and you can store them in the local property. The following code sample demonstrates to change the datasource connection strings based on Customer ID in the OnInitReportOptions
method.
string customerID = null;
public object PostReportAction(Dictionary<string, object> jsonResult)
{
if (jsonResult != null)
{
if (jsonResult.ContainsKey("customData"))
{
//Get client side custom data and store in local variable.
customerID = jsonResult["customData"].ToString();
}
}
return ReportHelper.ProcessReport(jsonResult, this);
}
public void OnInitReportOptions(ReportViewerOptions reportOption)
{
if (customerID != null)
{
if(customerID.Contains("CI0021"))
{
//If you are changing the connection string based on customer id then could you please change the connection string as below.
//reportOption.ReportModel.DataSourceCredentials.Add(new BoldReports.Web.DataSourceCredentials("<Datasource name>", "<connection string>"));
reportOption.ReportModel.DataSourceCredentials.Add(new BoldReports.Web.DataSourceCredentials("<database>", "Data Source=<instancename>;Initial Catalog=NorthwindSdf;"));
}
else if(customerID.Contains("CI0022"))
{
//If you are changing the connection string based on customer id then could you please change the connection string as below.
//reportOption.ReportModel.DataSourceCredentials.Add(new BoldReports.Web.DataSourceCredentials("<Datasource name>", "<connection string>"));
reportOption.ReportModel.DataSourceCredentials.Add(new BoldReports.Web.DataSourceCredentials("<database>", "Data Source=<instancename>;Initial Catalog=NorthwindSdf;"));
}
}
}
To perform custom action or show user defined message, use the ajaxSuccess
event on the successful Ajax request.
<bold-reportviewer id="reportViewer_Control"
[reportServiceUrl] = "serviceUrl"
[processingMode] = "Remote"
[reportServerUrl] = "serverUrl"
[reportPath] = "reportPath"
(ajaxSuccess) = "onAjaxSuccess($event)">
</bold-reportviewer>
import { Component, ViewChild } from '@angular/core';
import { BoldReportsAngularModule } from '@boldreports/angular-reporting-components/src/core';
@Component({
selector: 'ej-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
public serviceUrl: string;
public reportPath: string;
public serverUrl: string;
constructor() {
this.serviceUrl = 'https://demos.boldreports.com/services/api/ReportApi';
this.reportPath = 'Sales Order Detail.rdl';
}
onAjaxSuccess(event) {
//Perform your custom success message here
alert("Ajax request success!!!");
}
}
The ajaxError
event is called, if an error occurred with the Ajax request. You can display the customized error details in the event method.
<bold-reportviewer id="reportViewer_Control"
[reportServiceUrl] = "serviceUrl"
[processingMode] = "Remote"
[reportServerUrl] = "serverUrl"
[reportPath] = "reportPath"
(ajaxError) = "onAjaxFailure($event)">
</bold-reportviewer>
import { Component, ViewChild } from '@angular/core';
import { BoldReportsAngularModule } from '@boldreports/angular-reporting-components/src/core';
@Component({
selector: 'ej-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
public serviceUrl: string;
public reportPath: string;
public serverUrl: string;
constructor() {
this.serviceUrl = 'https://demos.boldreports.com/services/api/ReportApi';
this.reportPath = 'Sales Order Detail.rdl';
}
onAjaxFailure(event) {
alert("Status: " + event.status + "\n" +
"Error: " + event.responseText);
}
}
You can never have both an error and a success callback with a request.