Add user defined buttons to the toolbar and invoke custom actions using the Report Viewer
property. You can create a custom email button to send an email with the rendered report to users.
Create an email button in the toolbar using the CustomItems
property with the values such as GroupIndex
, Index
, Type
, CssClass
, and Tooltip
. The ToolBarItemClick
event triggers when you click the email button.
Access the Report Viewer model and create a JSON array for sending requests to the Web API Server. You can use the following codes to create an event with custom action.
You can use the following codes to add email button from controller and passing the data to view using ViewBag
.
public ActionResult Index()
{
ToolbarSettings toolbarSettings = new ToolbarSettings();
toolbarSettings.CustomItems = new List<CustomItem>();
var customItem = new CustomItem()
{
GroupIndex = 1,
Index = 1,
CssClass = "e-icon e-mail e-reportviewer-icon",
Type = BoldReports.ReportViewerEnums.ToolBarItemType.Default,
Id = "E-Mail",
Tooltip = new ToolTip() { Header = "E-Mail", Content = "Send rendered report as mail attachment" }
};
toolbarSettings.CustomItems.Add(customItem);
ViewBag.toolbarSettings = toolbarSettings;
return View();
}
You can use the following codes to set an ToolbarSettings
property at client side.
@(Html.Bold().ReportViewer("viewer")
.ReportServiceUrl("/api/ReportViewer")
.ReportPath("~/Resources/sales-order-detail.rdl")
.ToolbarSettings(toolbarSettings => toolbarSettings.CustomItems(@ViewBag.toolbarSettings.CustomItems))
)
You can use the following codes to create an ToolBarItemClick
event at client side.
@(Html.Bold().ReportViewer("viewer")
.ReportServiceUrl("/api/ReportViewer")
.ReportPath("~/Resources/sales-order-detail.rdl")
.ToolBarItemClick("onToolBarItemClick")
)
<script type="text/javascript">
function onToolBarItemClick(args) {
alert('Action Triggered');
}
</script>
You can use the following codes to get ToolbarSettings
properties on a dynamic object using ViewBag.toolbarSettings.CustomItems
and invoke custom actions using custom email button at client side.
@(Html.Bold().ReportViewer("viewer")
.ReportServiceUrl("/api/ReportViewer")
.ReportPath("~/Resources/sales-order-detail.rdl")
.ToolbarSettings(toolbarSettings => toolbarSettings.CustomItems(@ViewBag.toolbarSettings.CustomItems))
.ToolBarItemClick("onToolBarItemClick")
)
<script type="text/javascript">
function onToolBarItemClick(args) {
if (args.value == "E-Mail") {
var proxy = $('#viewer').data('boldReportViewer');
var Report = proxy.model.reportPath;
var lastsIndex = Report.lastIndexOf("/");
var reportName = Report.substring(lastsIndex + 1);
var requrl = proxy.model.reportServiceUrl + '/SendEmail';
var _json = {
exportType: "PDF", reportViewerToken: proxy._reportViewerToken, ReportName: reportName
};
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: requrl,
data: JSON.stringify(_json),
dataType: "json",
crossDomain: true
})
}
}
</script>
Create a new action method SendEmail
in the Web API service.
Export the report to the required type using the ReportHelper.GetReport
method to send a report stream as an attachment.
The following code sample exports the report to stream and send it as an attachment to a specified mail address. In the code, the SmtpClient
method is used to send the report as an email attachment.
public object SendEmail(Dictionary<string, object> jsonResult)
{
string _token = jsonResult["reportViewerToken"].ToString();
var stream = ReportHelper.GetReport(_token, jsonResult["exportType"].ToString());
stream.Position = 0;
if (!ComposeEmail(stream, jsonResult["reportName"].ToString()))
{
return "Mail not sent !!!";
}
return "Mail Sent !!!";
}
public bool ComposeEmail(Stream stream, string reportName)
{
try
{
MailMessage mail = new MailMessage();
SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");
mail.IsBodyHtml = true;
mail.From = new MailAddress("xx@gmail.com");
mail.To.Add("xx@gmail.com");
mail.Subject = "Report Name : " + reportName;
stream.Position = 0;
if (stream != null)
{
ContentType ct = new ContentType();
ct.Name = reportName + DateTime.Now.ToString() + ".pdf";
System.Net.Mail.Attachment attachment = new System.Net.Mail.Attachment(stream, ct);
mail.Attachments.Add(attachment);
}
SmtpServer.Port = 587;
SmtpServer.Credentials = new System.Net.NetworkCredential("xx@gmail.com", "xx");
SmtpServer.EnableSsl = true;
SmtpServer.Send(mail);
return true;
}
catch (Exception ex)
{
throw ex;
}
return false;
}
In the above code sample, the report is exported to PDF format and send to users using the
SmptClient
method.