Thursday, August 10, 2017

How to create crystal Reports with MVC.

Visual Studio 2015 installation will not have Crystal Reports and hence we need to  install it you can download it from the following location

Download Link



After downloading the link. Click on Open  and follow the below steps .






After installation of Crystal Reports. Let us start working on the example.
Go to Visual Studio

File-> New-Project



After clicking on ok , the below screen gets displayed: 

Select Empty and select the check box MVC




Configuring and connecting Entity Framework to database

Go to App Data to Add the DataBase as shown below

App Data--->Add--> New Item--> Sql Server DataBase 




In the visual Studio in the solution explorer you can find as shown below



Click on the Open,  the below screen gets displayed  and select New Query and execute the below script  to create the table




Script: 

CREATE TABLE [dbo].[EmployeeInfo] (
    [EmpNo]       INT          IDENTITY (1, 1) NOT NULL,
    [EmpName]     VARCHAR (50) NOT NULL,
    [Salary]      INT          NOT NULL,
    [DeptName]    VARCHAR (50) NOT NULL,
    [Designation] VARCHAR (50) NOT NULL,
    [HRA]         AS           ([Salary]*(0.2)),
    [TA]          AS           ([Salary]*(0.15)),
)

Now the table has been created , 

Go To Model Folder

Add-->New Item-->ADO.NET Entity Data Model




Give any Name and click on Add, the below screen will be displayed






And Click On Finish

Controller:

public class CrstalReportExampleController : Controller
    {
        // GET: CrstalReportExample
        public ActionResult Index()
        {
            EmployeeModel emp = new EmployeeModel();
            return View(from employee in emp.EmployeeInfoes.Take(10)
                        select employee);
        }
    }

Index.cs.html

<html>
<body>
    <h4>Employees</h4>
    <hr />
    <table cellpadding="0" cellspacing="0">
        <tr>
            <th>Employee Id</th>
            <th>Employee Name</th>
            <th>DeptName</th>  
            <th>Designation</th>  
           
        </tr>
        @foreach (WebApplication1.Models.EmployeeInfo employee in Model)
        {
            <tr>
                <td>@employee.EmpNo</td>
                <td>@employee.EmpName</td>
                <td>@employee.DeptName</td>
                <td>@employee.Designation</td>
            </tr>
        }
    </table>
    <br />
    <a href="~/Reports/WebForm1.aspx">View Report</a>
</body>
</html>

Create a new folder with the name Reports 





Right click on the folder Reports -Select -->Add-->New Item



Click on Add button

Select Standard Button as shown below



Once you press OK in the above screen  dialog, the Report Wizard starts and you get the following dialog where you need to choose the type of Database connection for your Crystal Report. 


Click on Next Button


Choose the columns which you want to display in the reports as shown below



After Clicking on Finish button the below screen gets displayed




Note now, Crystal Report works only with a Crystal Report Viewer control which is available only in ASP.Net Web Forms and hence for displaying a Crystal Report, you will need to add a Web Forms page.

Go to Reports Folder and Select Add--> New Item--> 



Now in this web form we need to add  Crystal Report Viewer control from the ToolBox as shown below




WebForm.aspx( Create this form in the Reports Folder).

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
    </div>
        <CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server" AutoDataBind="true" Height="450" Width="650"/>

    </form>
</body>
</html>


.cs

 private EmployeeModel context = new EmployeeModel();
        protected void Page_Load(object sender, EventArgs e)
        {

            
            CrystalReportViewer1.ToolPanelView = CrystalDecisions.Web.ToolPanelViewType.None;
            CrystalReport1 crystalReport = new CrystalReport1();
            List<EmployeeInfo> allemps = new List<EmployeeInfo>();
            allemps = context.EmployeeInfoes.ToList();

            crystalReport.SetDataSource(allemps);
            CrystalReportViewer1.ReportSource = crystalReport;
            //Response.Buffer = false;
            Response.ClearContent();
            //Response.ClearHeaders();
        }


Output:



After clicking on view Report



2 Example :

You can display the same report in another way as shown below

Modify the Controller code as shown below

private EmployeeModel context = new EmployeeModel();
        // GET: CrstalReportExample
        public ActionResult Index()
        {
            EmployeeModel emp = new EmployeeModel();
            return View(from employee in emp.EmployeeInfoes.Take(10)
                        select employee);
        }

        public ActionResult ExportCustomers()
        {

            List<EmployeeInfo> allemps = new List<EmployeeInfo>();
            allemps = context.EmployeeInfoes.ToList();


            ReportDocument rd = new ReportDocument();
            rd.Load(Path.Combine(Server.MapPath("~/Reports"), "CrystalReport1.rpt"));

            rd.SetDataSource(allemps);

            Response.Buffer = false;
            Response.ClearContent();
            Response.ClearHeaders();


            Stream stream = rd.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat);
            stream.Seek(0, SeekOrigin.Begin);
            return File(stream, "application/pdf", "EmployeeList.pdf");
        }

In the index.cs.html add the below line


<div><a href="@Url.Action("ExportCustomers")"> View Crystal Report </a></div>



output





Wednesday, August 9, 2017

How to Play Videos in ASP.NET MVC

Go to Visual Studio

File-> New-Project


The below screen gets displayed. Give any name of the application.

After clicking on ok , the below screen gets displayed: 
Select Empty and select the check box MVC



Let us create a custom action result, Now i have created a Folder with the Name CustomResult inside that i have created a new class File as shown Below



Write the below code in the PlayVideo.cs File 

public class PlayVideo:ActionResult
    {
        public override void ExecuteResult(ControllerContext context)
        {
            //The File Path 
            var videoFilePath = HostingEnvironment.MapPath("~/Videos/big_buck_bunny.mp4");
            //The header information 
            context.HttpContext.Response.AddHeader("Content-Disposition", "attachment; filename=Avent Anniversary.mp4");
            var file = new FileInfo(videoFilePath);
            //Check the file exist,  it will be written into the response 
            if (file.Exists)
            {
                var stream = file.OpenRead();
                var bytesinfile = new byte[stream.Length];
                stream.Read(bytesinfile, 0, (int)file.Length);
                context.HttpContext.Response.BinaryWrite(bytesinfile);
            }
        }
    }

Controller . Create a new controller with the Name VideoController
public class VideoController : Controller
    {
        // GET: Video
        public ActionResult Index()
        {
            return new PlayVideo();
        }
    }

Create a new Index 

Now run the application , Now You can see the below output  



Create another Contoller with the Name 

public class PlayVideoLiveController : Controller
    {
        // GET: PlayVideoLive
        public ActionResult Index()
        {
            return View();
        }
    }

Index.cs.html

<video width="320" height="240" controls autoplay="autoplay">
    <source src="@Url.Action("Index","Video")" type="video/mp4">
    </video>


Output:



Tuesday, August 8, 2017

Working with PDF IN ASP.NET MVC with Entity FrameWork.

With this example you can create pdf and print pdf.

If You are using ASP.NET MVC , PDF can be created by using Rotativa 

Rotativa is a framework that is used to print PDF documents in ASP.NET MVC Applications. This framework we can download using the nuget packages as shown below


Go to Visual Studio

File-> New-Project



The below screen gets displayed. Give any name of the application.


After clicking on ok , the below screen gets displayed: 
Select Empty and select the check box MVC




Let us configure rotative using Nuget as shown below .
Goto to Visual Studio Tools-NuGet Package Manager->Package Manager Console
The below screen gets displayed-> Type the Nuget package command for Rotative




Go to App Data to Add the DataBase as shown below
App Data--->Add--> New Item--> Sql Server DataBase 


In the visual Studio in the solution explorer you can find as shown below

Click on the Open,  the below screen gets displayed  and select New Query and execute the below script  to create the table





Script: 

CREATE TABLE [dbo].[EmployeeInfo] (
    [EmpNo]       INT          IDENTITY (1, 1) NOT NULL,
    [EmpName]     VARCHAR (50) NOT NULL,
    [Salary]      INT          NOT NULL,
    [DeptName]    VARCHAR (50) NOT NULL,
    [Designation] VARCHAR (50) NOT NULL,
    [HRA]         AS           ([Salary]*(0.2)),
    [TA]          AS           ([Salary]*(0.15)),
)

Now the table has been created , 

GoTo Model Folder
Add-->New Item-->ADO.NET Entity Data Model




Give any Name and click on Add, the below screen will be displayed







And Click On Finish

Now goto Contoller Folder and Add New Item


Controller Code:

public class MVCPDFController : Controller
    {
        public ActionResult Index()
        {
            var emps = ctx.EmployeeInfoes.ToList();
            return View(emps);
        }
        EmployeeModel ctx;
        public MVCPDFController()
        {
            ctx = new Models.EmployeeModel();
        }
        public ActionResult PrintAllReports()
        {
            var report = new ActionAsPdf("Index");
            return report;
        }
        public ActionResult PrintPdfDetails(int id)
        {
            var emp = ctx.EmployeeInfoes.Where(e => e.EmpNo == id).First();
            return View(emp);
        }
        public ActionResult PrintSalaryDetails(int id)
        {
            var report = new ActionAsPdf("PrintPdfDetails", new { id = id });
            return report;
        }
    }


Index.cs.html


@model IEnumerable<WebApplication1.Models.EmployeeInfo>
@{
    ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>
    @Html.ActionLink("View In PDF Format", "PrintAllReports")
</p>
<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.EmpName)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Salary)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.DeptName)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Designation)
        </th>
        <th></th>
    </tr>
    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.EmpName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Salary)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.DeptName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Designation)
            </td>
           
            <td>
                @Html.ActionLink("Print Pay Slip", "PrintSalaryDetails", new { id = item.EmpNo })
            </td>
        </tr>
    }
</table>



PrintPDFDetails.cs.html

@model WebApplication1.Models.EmployeeInfo

@{
    ViewBag.Title = "PrintPdfDetails";
}

<div>
<h2> Salary Details of the Employee : @Model.EmpName 
</h2>
<table>
    <tr>
        <td>Department Name :</td>
        <td>@Model.DeptName</td>
    </tr>
    <tr>
        <td>Designation :</td>
        <td>@Model.Designation</td>
    </tr>
</table>
    <table>
        <tr>
            <td>
                <table>
                    <tr>
                        <td colspan="2">Income Details</td>
                    </tr>
                    <tr>
                        <td>Salary</td>
                        <td>@Model.Salary</td>
                    </tr>
                    <tr>
                        <td>HRA</td>
                        <td>@Model.HRA</td>
                    </tr>
                    <tr>
                        <td>TA</td>
                        <td>@Model.TA</td>

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

    <p>
        @Html.ActionLink("Back to Home", "Index")
    </p>
</div>

OutPut


On Clicking on Print Pay Slip



On clicking on View pdf




Friday, May 19, 2017

Exceptions In MVC


(7 methods explained)
 
Method 1:- Simple way

Method 2:- Override "OnException" method

Method 3:- Using "HandleError" Attribute

Method 4:- Inheriting from "HandleErrorAttribute"

Method 5:- Handling HTTP errors

Method 6:- Global Error handling in MVC

Method 7 : Should create a log file in the system

 

Method 1:- Simple way
But if we use this method then we will not be utilizing MVC exception mechanismproperly and completely.
public ActionResult SomeError() { try {} catch(Exception ex) {return View("Error");} } 


Controller.



 View


Output:


Method 2:- Override “OnException” method

This approach is used when we want to handle all the exceptions across the Action methods at the controller level.
Controller
 public ActionResult Test()
        {
            int x = 1, y = 0;
            int z = x % y;
            return View();
        }

        protected override void OnException(ExceptionContext filterContext)
        {
            Exception ex = filterContext.Exception;
            filterContext.ExceptionHandled = true;

            var model = new HandleErrorInfo(filterContext.Exception, "Controller", "Action");
            filterContext.Result = new ViewResult()
            {
                ViewName = "Error",
                ViewData = new ViewDataDictionary(model.Exception.Message)
            };
        }

        public ActionResult Error()
        {
            return View();
        }
        // GET: Home
        public ActionResult Index()
        {
                int x = 1, y = 0;
                int z = x % y;
                return View();
        }

 


Output:

Second Example:

protected override void OnException(ExceptionContext filterContext)
        {
            if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
            {
                //return;
            }

            if (new HttpException(null, filterContext.Exception).GetHttpCode() != 500)
            {
                //return;
            }

            // if the request is AJAX return JSON else view.
            if (filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
            {
                filterContext.Result = new JsonResult
                {
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                    Data = new
                    {
                        error = true,
                        message = filterContext.Exception.Message
                    }
                };
            }
            else
            {
                var controllerName = (string)filterContext.RouteData.Values["controller"];
                var actionName = (string)filterContext.RouteData.Values["action"];
                var model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
                filterContext.Result = new ViewResult
                {
                    ViewName = "Error",
                    ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
                    TempData = filterContext.Controller.TempData
                };
            }

            // log the error using log4net.
            //_logger.Error(filterContext.Exception.Message, filterContext.Exception);

            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.StatusCode = 500;

            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
        }


In the View write the following code


Output:


The problem with this approach is we cannot reuse the error handling logic across multiple controllers.





The other way of handling error is my using “HandleError” attribute. Implementing “HandleError” attribute is a two-step process:-

Step 1 :- We need to first decorate the action method with “HandleError” attribute as shown in the below code

public class HomeController : Controller
 {
        [HandleError()]
        public ActionResult SomeError()
        {
            throw new Exception("test");
        }
}



Step 2:- In the “Web.config” file you need to add the “customErrors” tag and point to the “Error” view as shown in the below “Web.config” code snippet.
Hide  


<system.web>
<customErrors defaultRedirect="Error.cshtml" mode="On">
</customErrors>
</system.web>












In case you want different error views for different exception types you can decorate action method with multiple “HandleError” attribute point to multiple views as per exception types.

public class HomeController : Controller
{
        [HandleError(ExceptionType=typeof(ArithmeticException),View="Arthimetic")]
[HandleError(ExceptionType = typeof(NotImplementedException),View ="Error1")]


public ActionResult SomeError()
{
   
}


}




Still working on it..............................

Kubernetes

Prerequisites We assume anyone who wants to understand Kubernetes should have an understating of how the Docker works, how the Docker images...