Wednesday 19 November 2014

Export Functionality in MVC


Exporting a data or report to Excel/PDF is one of the most common functionality required in enterprise application in ASP.NET MVC. This blog includes the code for export functionality.

By calling ExportToExcel ActionResult method, PDF or Excel will be generated with given datasource.

Controller - Home


public ActionResult Index()
{
            return View();
}
public ActionResult ExportToExcel()
{
            List<myList> oReportList = new getList()

            System.Web.UI.WebControls.GridView gv = new System.Web.UI.WebControls.GridView();
            gv.DataSource = oReportList;
            gv.DataBind();
            Response.ClearContent();
            Response.Buffer = true;
          
            Response.AddHeader("content-disposition", "attachment; filename=AttendanceReport.xls");
            Response.ContentType = "application/ms-excel";

            //For PDF
            //Response.AddHeader("content-disposition","attachment;filename=AttendanceReport.pdf");
            //Response.ContentType = "application/pdf";

            Response.Charset = "";
            StringWriter sw = new StringWriter();
            HtmlTextWriter htw = new HtmlTextWriter(sw);
            gv.RenderControl(htw);
            Response.Output.Write(sw.ToString());
            Response.Flush();
            Response.End();

            return Json("Success");
 }


Our view will be look like below. Here is shown a code how ExportToExcel button can call from any page.

View : Index

  @using (Html.BeginForm("ExportToExcel", "Home", FormMethod.Post, new { id = "iReportForm" }))
   {
     <button id="iExport" value="ExportToExcel" class="btn green" type="submit">Export To Excel</button>
   }


Wednesday 15 October 2014

Web Grid in MVC

WebGrid is very rich control to display data in a web page using an HTML table elements. WebGrid will renders data into HTML and it support advance functionalities like asynchronous updates, paging, sorting, custom formatting.

In this blog, I have explained you to use WebGrid in our MVC application.

SQL:
Create Table which shows in List
CREATE TABLE [dbo].[tblPersonalDetail] (
 [ID] [int] IDENTITY(1, 1) NOT NULL
 ,[Name] [varchar](500) NULL
 ,[Address] [varchar](500) NULL
 ,[ContactNo] [varchar](500) NULL
 ,[PinCode] [numeric](10, 0) NULL
 ,CONSTRAINT [PK_PersonalDetail] PRIMARY KEY CLUSTERED ([ID] ASC) WITH (
  PAD_INDEX = OFF
  ,STATISTICS_NORECOMPUTE = OFF
  ,IGNORE_DUP_KEY = OFF
  ,ALLOW_ROW_LOCKS = ON
  ,ALLOW_PAGE_LOCKS = ON
  ) ON [PRIMARY]
 ) ON [PRIMARY]

Now insert data in it
SET IDENTITY_INSERT [dbo].[tblPersonalDetail] ON

INSERT [dbo].[tblPersonalDetail] ([ID],[Name],[Address],[ContactNo],[PinCode])
VALUES (1,N'Chintan',N'Naranpura',N'77829827',CAST(380014 AS NUMERIC(10, 0)))

INSERT [dbo].[tblPersonalDetail] (,[Name],[Address],[ContactNo],[PinCode])
VALUES (1,N'shah',N'Naranpuras',N'77829827',CAST(380014 AS NUMERIC(10, 0)))

Create Procedure with paging logic like this

--dbo.[Demo_Paging_Logic] 1,10,'Name ASC','1=1'
ALTER PROCEDURE dbo.[Demo_Paging_Logic] @PageNumber INT = 1
 ,@PageSize INT = 5
 ,@SortExpression NVARCHAR(20) = 'Name DESC'
 ,@WhereCondition NVARCHAR(MAX) = ' 1=1 '
AS
BEGIN
 SET NOCOUNT ON;

 DECLARE @FirstRec INT
  ,@LastRec INT
  ,@TotalRows INT

 SET @FirstRec = (@PageNumber - 1) * @PageSize
 SET @LastRec = (@PageNumber * @PageSize + 1)
 SET @TotalRows = @FirstRec - @LastRec + 1

 DECLARE @SortExpression1 NVARCHAR(MAX)
 DECLARE @Query NVARCHAR(MAX)
 DECLARE @Query1 NVARCHAR(MAX)

 SET @Query = 'SELECT *
     FROM(SELECT Cast(ROW_NUMBER() OVER (ORDER BY  ' + @SortExpression + ') As int) AS ROWNUM, COUNT(*) OVER(PARTITION BY 1) TotalRecord,*
     FROM tblPersonalDetail WHERE  ' + @WhereCondition + ') AS  tbl
     WHERE ROWNUM > ' + CONVERT(NVARCHAR(10), @FirstRec) + ' AND ROWNUM < ' + CONVERT(NVARCHAR(10), @LastRec) + ' ORDER BY ROWNUM ASC'

 PRINT @Query

 EXEC sp_Executesql @Query
END
GO


After creating this, Add one Entity Framework by ADO.NET Entity Data Model with entity name called TestEntities1.

Model
    namespace PiyaPiya.Controllers
{
    public class FriendsPageViewModel
    {
        public int NumberOfFriends { get; set; }
        public List<Demo_Paging_Logic_Result> LST { get; set; }
        public int FriendsPerPage { get; set; }
    }
}


Controller
 #region Web Grid

        public ActionResult WebGrid(int page = 1, string sort = "Name", string sortDir = "ASC", string search = null, string ContactNo = null, int? minChildren = null, int? maxChildren = null, string PageSize = "10")
        {
            ViewBag.PageSize = new List<SelectListItem>() { new SelectListItem() { Text = "5", Value = "5" }, new SelectListItem() { Text = "10", Value = "10", Selected = true }, new SelectListItem() { Text = "20", Value = "20" } };

            int FRIENDS_PER_PAGE = Convert.ToInt32(PageSize);//Declare By RV for Page Size

            List<Demo_Paging_Logic_Result> obj = new List<Demo_Paging_Logic_Result>();

            TestEntities1 _db = new TestEntities1();

            obj = _db.Demo_Paging_Logic(page, FRIENDS_PER_PAGE, sort + " " + sortDir, "Name  like '%" + search + "%' and ContactNo like '%" + ContactNo + "%'").ToList<Demo_Paging_Logic_Result>();

            var data = new FriendsPageViewModel()
            {
                NumberOfFriends = obj.Count > 0 ? Convert.ToInt32(obj[0].TotalRecord) : 0,
                FriendsPerPage = FRIENDS_PER_PAGE,
                LST = obj
            };

            return View(data);

        }
}
#endregion


View
@*PM> Install-Package WebGridMvc*@
@model  PiyaPiya.Controllers.FriendsPageViewModel
<script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>
<script>
    function Clear() {
        $(".removeLater").val('');
    }
</script>
<style type="text/css">
    .grid {
        margin: 4px;
        border-collapse: collapse;
        width: 500px;
        background-color: #B4CFC3;
    }

    .header {
        background-color: #C1D4E6;
        font-weight: bold;
        color: #FFF;
    }

    .webGrid th, .webGrid td {
        border: 1px solid #C0C0C0;
        padding: 5px;
        width: 10%;
        text-align: center;
    }

    .alt {
        background-color: #E4E9F5;
        color: #000;
    }

    .gridHead a:hover {
        text-decoration: underline;
    }

    .description {
        width: auto;
    }

    .select {
        background-color: #71857C;
    }
</style>
@{
    Layout = null;
    ViewBag.Title = "WebGrid";
}
<h6>Web Grid</h6>
@{
    //var grid = new WebGrid(
    //Model.LST,
    //rowsPerPage: Model.FriendsPerPage,
    //defaultSort: "LookupValuesID",
    //columnNames: new[] { "LookupValuesID", "LookupValue" }
    //    );
    var grid = new WebGrid(defaultSort: "Name", canPage: true, rowsPerPage: Model.FriendsPerPage, ajaxUpdateContainerId: "grid");
    grid.Bind(Model.LST, autoSortAndPage: false, rowCount: Model.NumberOfFriends);
    grid.Pager(WebGridPagerModes.All);
}

@using (Html.BeginForm(null, null, FormMethod.Get))
{
    <fieldset>
        <legend>Search criteria</legend>
        @Html.Label("search", "Name:")
        @Html.TextBox("search", null, new { @class = "removeLater" })
        @Html.Label("ContactNo", "ContactNo:")
        @Html.TextBox("ContactNo", null, new { @class = "removeLater" })
        @Html.Label("Page Size", "Page Size:")
        @Html.DropDownList("PageSize", (List<SelectListItem>)ViewBag.PageSize)
        @*@Html.Label("minChildren", "Children min:")
            @Html.TextBox("minChildren", null, new { @class = "num" })
            @Html.Label("maxChildren", "Children max:")
            @Html.TextBox("maxChildren", null, new { @class = "num" })*@
        <input type="submit" value="Apply" />
        <input type="submit" value="Clear" onclick="Clear();" />

    </fieldset>
}
@grid.GetHtml(
    tableStyle: "webGrid",
                headerStyle: "header",
                alternatingRowStyle: "alt",
                selectedRowStyle: "select",
    htmlAttributes: new { id = "grid" },
    fillEmptyRows: false,
    mode: WebGridPagerModes.All,
    firstText: "<< First",
    previousText: "< Prev",
    nextText: "Next >",
    lastText: "Last >>",
    columns: grid.Columns
    (
            grid.Column("ID", header: "ID"),
            grid.Column("Name", header: "Name"),
                    grid.Column("Address", header: "Address"),
                            grid.Column("ContactNo", header: "ContactNo")
    )
)

Friday 16 May 2014

DevExpress GridView Customize with MVC

To implemente DevExpress GridView we need to use DevExpress function @Html.DevExpress().GridView(). This consume lots of time as we need to write some same code again and again. So I have implemented DevExpress GridView's Overload Method which reduce the nuber of lines of codes and also reduce the complexity of code.

Here I am Adding one Overload Method for DevExpress GridView in MVC. Here I am creating one Extension Method to Get and Set Property for the Grid which Varies in Different Grid.

Here I am going to add GridView name, Keyfield name, Route information, and grid with popup's width and height settings.

Properties Class :

public class CommonGridSettingPopupEntity
    {
        public string GridName { get; set; }
        public string KeyFieldName { get; set; }
        public string RouteArea { get; set; }
        public string RouteController { get; set; }
        public string RouteAction { get; set; }
        public bool GridWidth_Height_In_Pixel { get; set; }
        public double GridWidth { get; set; }
        public double GridHeight { get; set; }
        public string GridLayoutName { get; set; }
        public string PopupEditFormCaption { get; set; }
        public int PopupWidth_Pixel { get; set; }
        public int PopupHeight_Pixel { get; set; }
        public bool PopupWidth_Height_In_Perc { get; set; }


        public CommonGridSettingPopupEntity()
        {
            GridWidth = 100;
            GridHeight = 100;
            PopupWidth_Pixel = 450;
            PopupHeight_Pixel = 300;
            GridWidth_Height_In_Pixel = false;
            PopupWidth_Height_In_Perc = false;

        }


Now I am creating Extension Method by which we can easily generate our requuire type's column.

Column's Extensions :

namespace DevExpress.Web.Mvc
{

    #region Grid Columns
    public static class GridColumn
    {

        #region String


        /// <summary>
        ///
        /// </summary>
        /// <param name="settings"></param>
        /// <param name="FieldName"></param>
        /// <param name="DisplayName">(Optional) pass Column Caption name(If you dont want to pass caption then pass ""(blank) )</param>
        /// <param name="Width">(Optional) Pass column width (If you dont want to pass width then pass 0).</param>
        /// <param name="IsCentre">(Optional) If you want to create column centre then pass true otherwise false</param>
        public static void GetStringColumn(GridViewSettings settings, string FieldName, string DisplayName = "", int Width = 0, bool IsCentre = false)
        {
            settings.Columns.Add(gridViewColumn =>
             {
                 if (DisplayName != "")
                     gridViewColumn.Caption = DisplayName;

                 if (Width != 0)
                     gridViewColumn.Width = Unit.Pixel(Width);

                 if (IsCentre == true)
                 {
                     gridViewColumn.CellStyle.HorizontalAlign = HorizontalAlign.Center;
                     gridViewColumn.HeaderStyle.HorizontalAlign = HorizontalAlign.Center;
                 }
                 else
                 {
                     gridViewColumn.CellStyle.HorizontalAlign = HorizontalAlign.Left;
                     gridViewColumn.HeaderStyle.HorizontalAlign = HorizontalAlign.Left;
                 }

                 gridViewColumn.FieldName = FieldName;
                 gridViewColumn.Settings.AutoFilterCondition = AutoFilterCondition.Contains;
                 gridViewColumn.HeaderStyle.Wrap = DefaultBoolean.True;
             });
        }

        #region String
        public static void GetHiddenColumn(GridViewSettings settings, string FieldName)
        {
            settings.Columns.Add(gridViewColumn =>
            {
                gridViewColumn.FieldName = FieldName;
                gridViewColumn.Visible = false;
            });
        }

        #endregion


        //public static void GetStringColumn(GridViewSettings settings, string FieldName, string DisplayName, int Width)
        //{
        //    //return new MVCxGridViewColumnCollection<TModel>(Columns);
        //    settings.Columns.Add(gridViewColumn =>
        //     {
        //         gridViewColumn.Caption = DisplayName;
        //         gridViewColumn.FieldName = FieldName;
        //         gridViewColumn.CellStyle.HorizontalAlign = HorizontalAlign.Left;
        //         gridViewColumn.HeaderStyle.HorizontalAlign = HorizontalAlign.Left;
        //         gridViewColumn.Width = Unit.Pixel(Width);
        //         gridViewColumn.HeaderStyle.Wrap = DefaultBoolean.True;
        //         gridViewColumn.Settings.AutoFilterCondition = AutoFilterCondition.Contains;
        //     });



        //}

        #endregion

        #region DateTime
        public static void GetDateColumn(GridViewSettings settings, string FieldName, string DisplayName, string DisplayFormatString = "d")
        {
            settings.Columns.Add(gridViewColumn =>
             {
                 gridViewColumn.Caption = DisplayName;
                 gridViewColumn.FieldName = FieldName;
                 gridViewColumn.CellStyle.HorizontalAlign = HorizontalAlign.Center;
                 gridViewColumn.HeaderStyle.HorizontalAlign = HorizontalAlign.Center;
                 gridViewColumn.ColumnType = MVCxGridViewColumnType.DateEdit;
                 gridViewColumn.Settings.AutoFilterCondition = AutoFilterCondition.Equals;
                 gridViewColumn.PropertiesEdit.DisplayFormatString = DisplayFormatString;
                 gridViewColumn.HeaderStyle.Wrap = DefaultBoolean.True;
             });



        }

        public static void GetDateColumn(GridViewSettings settings, string FieldName, string DisplayName, int Width, string DisplayFormatString = "d")
        {
            settings.Columns.Add(gridViewColumn =>
             {
                 gridViewColumn.Caption = DisplayName;
                 gridViewColumn.FieldName = FieldName;
                 gridViewColumn.Width = Unit.Pixel(Width);
                 gridViewColumn.CellStyle.HorizontalAlign = HorizontalAlign.Center;
                 gridViewColumn.HeaderStyle.HorizontalAlign = HorizontalAlign.Center;
                 gridViewColumn.ColumnType = MVCxGridViewColumnType.DateEdit;
                 gridViewColumn.Settings.AutoFilterCondition = AutoFilterCondition.Equals;
                 gridViewColumn.PropertiesEdit.DisplayFormatString = DisplayFormatString;
                 gridViewColumn.HeaderStyle.Wrap = DefaultBoolean.True;

             });
        }

        #endregion

        #region Numeric
        public static void GetNumericColumn(GridViewSettings settings, string FieldName, string DisplayName)
        {
            settings.Columns.Add(gridViewColumn =>
             {
                 gridViewColumn.Caption = DisplayName;
                 gridViewColumn.FieldName = FieldName;
                 gridViewColumn.ColumnType = MVCxGridViewColumnType.SpinEdit;
                 gridViewColumn.CellStyle.HorizontalAlign = HorizontalAlign.Center;
                 gridViewColumn.HeaderStyle.HorizontalAlign = HorizontalAlign.Center;
                 gridViewColumn.Settings.AutoFilterCondition = AutoFilterCondition.Equals;
                 gridViewColumn.HeaderStyle.Wrap = DefaultBoolean.True;
             });

        }

        //"{0:c2}"
        public static void GetNumericColumn(GridViewSettings settings, string FieldName, string DisplayName, string DisplayFormatString, int Width = 0)
        {
            settings.Columns.Add(gridViewColumn =>
             {
                 gridViewColumn.Caption = DisplayName;
                 gridViewColumn.FieldName = FieldName;
                 gridViewColumn.ColumnType = MVCxGridViewColumnType.SpinEdit;
                 gridViewColumn.CellStyle.HorizontalAlign = HorizontalAlign.Center;
                 gridViewColumn.HeaderStyle.HorizontalAlign = HorizontalAlign.Center;
                 gridViewColumn.Settings.AutoFilterCondition = AutoFilterCondition.Equals;
                 gridViewColumn.HeaderStyle.Wrap = DefaultBoolean.True;
                 gridViewColumn.PropertiesEdit.DisplayFormatString = DisplayFormatString;

                 if (Width != 0)
                     gridViewColumn.Width = Unit.Pixel(Width);
             });
        }


        public static void GetNumericColumn(GridViewSettings settings, string FieldName, string DisplayName, int Width)
        {

            settings.Columns.Add(gridViewColumn =>
         {
             gridViewColumn.Caption = DisplayName;
             gridViewColumn.FieldName = FieldName;
             gridViewColumn.ColumnType = MVCxGridViewColumnType.SpinEdit;
             gridViewColumn.CellStyle.HorizontalAlign = HorizontalAlign.Center;
             gridViewColumn.HeaderStyle.HorizontalAlign = HorizontalAlign.Center;
             gridViewColumn.Settings.AutoFilterCondition = AutoFilterCondition.Equals;
             gridViewColumn.HeaderStyle.Wrap = DefaultBoolean.True;
             gridViewColumn.Width = Unit.Pixel(Width);
         });

        }

        #endregion


        #region LinkColumn

        public static void GetLinkColumn(HtmlHelper htmlhelper, GridViewSettings settings, string FieldName, string DisplayName, int Width, string GridName)
        {

            settings.Columns.Add(gridViewColumn =>
             {
                 gridViewColumn.FieldName = FieldName;
                 gridViewColumn.Caption = DisplayName;
                 gridViewColumn.Width = Unit.Pixel(Width);
                 gridViewColumn.CellStyle.HorizontalAlign = HorizontalAlign.Left;
                 gridViewColumn.HeaderStyle.HorizontalAlign = HorizontalAlign.Left;
                 gridViewColumn.SetDataItemTemplateContent(container =>
                 {

                     htmlhelper.ViewContext.Writer.Write(string.Format("<a href = 'javascript:void(0)' style='width:{3}px;' onclick='{0}.StartEditRow({1});'>{2}</a>", GridName, (container as GridViewDataItemTemplateContainer).VisibleIndex, container.Text, Width));


                 });
                 gridViewColumn.Settings.AutoFilterCondition = AutoFilterCondition.Contains;

             });
        }

        public static void GetLinkColumn(HtmlHelper htmlhelper, GridViewSettings settings, string FieldName, string DisplayName, string GridName)
        {

            settings.Columns.Add(gridViewColumn =>
             {
                 gridViewColumn.FieldName = FieldName;
                 gridViewColumn.Caption = DisplayName;
                 gridViewColumn.HeaderStyle.HorizontalAlign = HorizontalAlign.Left;
                 gridViewColumn.CellStyle.HorizontalAlign = HorizontalAlign.Left;
                 gridViewColumn.SetDataItemTemplateContent(container =>
                 {

                     htmlhelper.ViewContext.Writer.Write(string.Format("<a href = 'javascript:void(0)'  onclick='{0}.StartEditRow({1});'>{2}</a>", GridName, (container as GridViewDataItemTemplateContainer).VisibleIndex, container.Text));


                 });
                 gridViewColumn.Settings.AutoFilterCondition = AutoFilterCondition.Contains;

             });
        }

        #endregion

        #region Link Column To Redirect BY ID

        public static void GetLinkRedirectColumn(HtmlHelper htmlhelper, GridViewSettings settings, string FieldName, string DisplayName, int Width, string URL)
        {
            settings.Columns.Add(gridViewColumn =>
            {
                gridViewColumn.FieldName = FieldName;
                gridViewColumn.Caption = DisplayName;
                gridViewColumn.Width = Unit.Pixel(Width);
                gridViewColumn.CellStyle.HorizontalAlign = HorizontalAlign.Left;
                gridViewColumn.HeaderStyle.HorizontalAlign = HorizontalAlign.Left;
                gridViewColumn.SetDataItemTemplateContent(container =>
                {
                    htmlhelper.ViewContext.Writer.Write("<a href='" + URL + "'>" + container.Text + "</a>");

                });
                gridViewColumn.Settings.AutoFilterCondition = AutoFilterCondition.Contains;
            });
        }

        public static void GetLinkRedirectColumn(HtmlHelper htmlhelper, GridViewSettings settings, string FieldName, string DisplayName, string URL)
        {

            settings.Columns.Add(gridViewColumn =>
            {
                gridViewColumn.FieldName = FieldName;
                gridViewColumn.Caption = DisplayName;
                gridViewColumn.HeaderStyle.HorizontalAlign = HorizontalAlign.Left;
                gridViewColumn.CellStyle.HorizontalAlign = HorizontalAlign.Left;
                gridViewColumn.SetDataItemTemplateContent(container =>
                {

                    htmlhelper.ViewContext.Writer.Write("<a href='" + URL + "'>" + container.Text + "</a>");


                });
                gridViewColumn.Settings.AutoFilterCondition = AutoFilterCondition.Contains;

            });
        }

        #endregion

        #region DeleteButton

        public static void GetDeleteColumn(GridViewSettings settings, string ButtonID, string ButtonText, string ButtonURL, string fnCustomButtonClick, int width)
        {
            GridViewCommandColumnCustomButton deleteButton = new GridViewCommandColumnCustomButton()
            {
                ID = ButtonID,
                Text = ButtonText
            };
            deleteButton.Image.Url = ButtonURL;
            deleteButton.Image.AlternateText = "Delete";
            deleteButton.Image.IsResourcePng = true;
            settings.CommandColumn.Visible = true;
            settings.CommandColumn.ButtonType = System.Web.UI.WebControls.ButtonType.Image;
            settings.CommandColumn.CustomButtons.Add(deleteButton);
            settings.CommandColumn.Width = System.Web.UI.WebControls.Unit.Pixel(width);
            settings.CommandColumn.VisibleIndex = 30;
            settings.CommandColumn.SetHeaderTemplateContent(c =>
            {
            });
            settings.ClientSideEvents.CustomButtonClick = string.Format("function(s, e) {{ {0}(s, e); }}", fnCustomButtonClick);
        }

        public static void GetDeleteColumn(GridViewSettings settings, string ButtonID, string ButtonText, string ButtonURL, string fnCustomButtonClick)
        {
            GridViewCommandColumnCustomButton deleteButton = new GridViewCommandColumnCustomButton()
            {
                ID = ButtonID,
                Text = ButtonText
            };
            deleteButton.Image.Url = ButtonURL;
            deleteButton.Image.AlternateText = "Delete";
            deleteButton.Image.IsResourcePng = true;
            settings.CommandColumn.Visible = true;
            settings.CommandColumn.ButtonType = ButtonType.Image;
            settings.CommandColumn.CustomButtons.Add(deleteButton);
            settings.CommandColumn.Width = Unit.Pixel(16);
            settings.CommandColumn.VisibleIndex = 30;
            settings.CommandColumn.SetHeaderTemplateContent(c =>
            {
            });
            settings.ClientSideEvents.CustomButtonClick = string.Format("function(s, e) {{ {0}(s, e); }}", fnCustomButtonClick);
        }
        #endregion
    }
}


Now Creating GridView's Overload which makes you easier to build your DevExpress Grid. Here I am going to write code for it.

GridView Overload :

namespace DevExpress.Web.Mvc
{
  public static class GridViewExtensions
  {
    public static GridViewExtension GridViewDefaultPopup(this ExtensionsFactory extensionsFactory,
                                                                                    ViewContext viewContext,
                                                                                   CommonGridSettingPopupEntity objCommonGrid,
                                                                                    Action<GridViewSettings> action)
        {
            GridViewSettings gridViewSettings = new GridViewSettings();

            gridViewSettings.Name = objCommonGrid.GridName;
            gridViewSettings.KeyFieldName = objCommonGrid.KeyFieldName;


            #region Grid Height and Width

            if (!objCommonGrid.GridWidth_Height_In_Pixel)
            {
                gridViewSettings.Width = System.Web.UI.WebControls.Unit.Percentage(objCommonGrid.GridWidth);

                gridViewSettings.Height = System.Web.UI.WebControls.Unit.Percentage(objCommonGrid.GridHeight);

                gridViewSettings.Settings.HorizontalScrollBarMode = ScrollBarMode.Auto;
            }
            else
            {
                gridViewSettings.Width = System.Web.UI.WebControls.Unit.Pixel(Convert.ToInt32(objCommonGrid.GridWidth));

                if (objCommonGrid.GridHeight != 0)
                    gridViewSettings.Height = System.Web.UI.WebControls.Unit.Pixel(Convert.ToInt32(objCommonGrid.GridHeight));
            }

            // if (objCommonGrid.GridWidth != 0)

            #endregion

            #region Call Back Route (Controller , View , Action)
            if (!string.IsNullOrWhiteSpace(objCommonGrid.RouteController))
                gridViewSettings.CallbackRouteValues = new { Area = objCommonGrid.RouteArea, Controller = objCommonGrid.RouteController, Action = objCommonGrid.RouteAction };

            #endregion


            #region Pager and Filter Settings
            gridViewSettings.Settings.ShowFilterRow = true;
            gridViewSettings.Settings.ShowFilterRowMenu = true;
            gridViewSettings.SettingsPager.ShowEmptyDataRows = true;
            gridViewSettings.SettingsPager.Position = System.Web.UI.WebControls.PagerPosition.Bottom;
            gridViewSettings.SettingsPager.FirstPageButton.Visible = true;
            gridViewSettings.SettingsPager.LastPageButton.Visible = true;
            gridViewSettings.SettingsPager.PageSizeItemSettings.Visible = true;
            gridViewSettings.SettingsPager.PageSizeItemSettings.Items = new string[] { "10", "20", "50" };

            #endregion

            #region Empty Row Template
            gridViewSettings.SetEmptyDataRowTemplateContent(c =>
            {
                viewContext.Writer.Write("No data to display");
            });

            #endregion

            #region Get and Save Layout Code

            if (!string.IsNullOrWhiteSpace(objCommonGrid.GridLayoutName))
            {
                gridViewSettings.DataBinding = (sender, e) =>
                {
                    //Set Session Value
                    HttpContext.Current.Session["GridLayout"] = null;
                };

                gridViewSettings.ClientLayout = (sender, e) =>
                {

                    if (e.LayoutMode == ClientLayoutMode.Loading)
                    {

                        iFacilities.Controllers.CommonController obj = new iFacilities.Controllers.CommonController();
                        string strLayout = obj.getLayout(objCommonGrid.GridLayoutName,
                            iFacilities.Controllers.CommonController.getLoginUserInfoByEnum(CommonFunctions.UserLoginData.UserID, HttpContext.Current.Request.Cookies[System.Web.Security.FormsAuthentication.FormsCookieName]));

                        if (strLayout.Length > 0)
                            e.LayoutData = strLayout;
                    }
                    else
                        if (e.LayoutMode == ClientLayoutMode.Saving)
                        {
                            HttpContext.Current.Session["GridLayout"] = String.Format("{0}#$#{1}", e.LayoutData, objCommonGrid.GridLayoutName);
                        }
                };
            }

            #endregion

            #region Column Chooser
            gridViewSettings.SettingsBehavior.EnableCustomizationWindow = true;
            #endregion

            #region Popup Edit code

            gridViewSettings.SettingsEditing.Mode = GridViewEditingMode.PopupEditForm;
            gridViewSettings.SettingsPopup.EditForm.Modal = true;
            gridViewSettings.SettingsPopup.EditForm.HorizontalAlign = PopupHorizontalAlign.WindowCenter;
            gridViewSettings.SettingsPopup.EditForm.VerticalAlign = PopupVerticalAlign.WindowCenter;
            if (objCommonGrid.PopupWidth_Height_In_Perc)
            {
                gridViewSettings.SettingsPopup.EditForm.Width = Unit.Percentage(objCommonGrid.PopupWidth_Pixel);
                gridViewSettings.SettingsPopup.EditForm.Height = Unit.Percentage(objCommonGrid.PopupHeight_Pixel);
            }
            else
            {
                gridViewSettings.SettingsPopup.EditForm.Width = Unit.Pixel(objCommonGrid.PopupWidth_Pixel);
                gridViewSettings.SettingsPopup.EditForm.Height = Unit.Pixel(objCommonGrid.PopupHeight_Pixel);
            }

            gridViewSettings.SettingsPopup.EditForm.ResizingMode = ResizingMode.Live;


            gridViewSettings.SettingsText.PopupEditFormCaption = objCommonGrid.PopupEditFormCaption;

            gridViewSettings.CommandColumn.SetHeaderTemplateContent(c =>
            {

            });
            #endregion

            action(gridViewSettings);
            return new GridViewExtension(gridViewSettings, viewContext);
        }
  }
}



Lastly, I am showing you Example which uses the overload's we have created.

Grid View Example with Custom Overload :

This is our MVC View :

@{
 CommonGridSettingPopupEntity objGridSettings = new CommonGridSettingPopupEntity(); objGridSettings.GridName = "grdContractBuildingInfo";
 objGridSettings.RouteArea = "Contract";
 objGridSettings.RouteController = "ContractInfo";
 objGridSettings.RouteAction = "PartialContractBuildingFormGrid";
 objGridSettings.KeyFieldName = "KeyID";
 objGridSettings.PopupEditFormCaption = "Contract Building Info"; objGridSettings.GridWidth_Height_In_Pixel = true;
 objGridSettings.GridHeight = 600;
 objGridSettings.GridWidth = 1000;
 objGridSettings.PopupHeight_Pixel = 500;
 objGridSettings.PopupWidth_Pixel = 800;
}
@Html.DevExpress().GridViewDefaultPopup(Html.ViewContext, objGridSettings, settings => { 

settings.ClientSideEvents.BeginCallback = string.Format("function(s, e) {{ }}");

GridColumn.GetHiddenColumn(settings, "KeyID");
GridColumn.GetHiddenColumn(settings, "BuildingID");

DevExpress.Web.Mvc.GridColumn.GetLinkColumn(this.Html, settings, "Building", "Building", 320, settings.Name);

GridColumn.GetStringColumn(settings, "JobNo", "Job No", 110, true);

 GridColumn.GetStringColumn(settings, "Manager", "Manager", 140);

 GridColumn.GetStringColumn(settings, "Director", "Director", 140);

 GridColumn.GetStringColumn(settings, "Supervisor", "Supervisor", 140);

 GridColumn.GetDateColumn(settings, "TerminateDate", "Terminate Date", 110);

 GridColumn.GetDateColumn(settings, "SuspendDate", "Suspend Date", 110);

 settings.SetEditFormTemplateContent(c => {
Html.RenderAction("PartialContractBuildingFormEdit");
});

 }).BindToLINQ("iFacilities.MODEL", "tblSQL", (s, e) =>
{
 e.KeyExpression = "KeyID";
 DBEntities DBS = new DBEntities();
 IQueryable ContractBuilding = from tbl in DBS.tblSQL select tbl;
  e.QueryableSource = ContractBuilding;
}).GetHtml()

Now try this to implement in your project. And See how much time you can save to implemet DevExpress Grid.

ENJOY !!

Thursday 8 May 2014

SQL - Paging Logic Stored Procedure and Between Dates Filter Query

Here is the store procedure by which you can fetch your require data with paging and filter you need

Paging Logic
--EXEC dbo.[Demo_Paging_Logic] 1,10,'LookupValue ASC','LookupValue like''%123%''
CREATE PROCEDURE dbo.[Demo_Paging_Logic] @PageNumber INT = 1
 ,@PageSize INT = 5
 ,@SortExpression NVARCHAR(20) = 'LookupValue DESC'
 ,@WhereCondition NVARCHAR(MAX) = ' 1=1 '
AS
BEGIN
 SET NOCOUNT ON;

 DECLARE @FirstRec INT
  ,@LastRec INT
  ,@TotalRows INT

 SET @FirstRec = (@PageNumber - 1) * @PageSize
 SET @LastRec = (@PageNumber * @PageSize + 1)
 SET @TotalRows = @FirstRec - @LastRec + 1

 DECLARE @SortExpression1 NVARCHAR(MAX)
 DECLARE @Query NVARCHAR(MAX)
 DECLARE @Query1 NVARCHAR(MAX)

 SET @Query = 'SELECT *
     FROM(SELECT Cast(ROW_NUMBER() OVER (ORDER BY  ' + @SortExpression + ') As int) AS ROWNUM, COUNT(*) OVER(PARTITION BY 1) TotalRecord,*
     FROM Master.tblLookupValues WHERE  ' + @WhereCondition + ') AS  tbl
     WHERE ROWNUM > ' + CONVERT(NVARCHAR(10), @FirstRec) + ' AND ROWNUM < ' + CONVERT(NVARCHAR(10), @LastRec) + ' ORDER BY ROWNUM ASC'

 PRINT @Query

 EXEC sp_Executesql @Query
END
GO


Filter between two dates in SQL


DECLARE @StartDate AS VARCHAR(10) = '10-03-2014'
DECLARE @EndDate AS VARCHAR(10) = '26-03-2014'

SELECT *
FROM tABLE
WHERE Cast(convert(DATETIME, Cast(CreatedDate AS DATETIME), 103) AS DATE) BETWEEN Cast(convert(DATETIME, @StartDate, 103) AS DATE)
AND Cast(convert(DATETIME, @EndDate, 103) AS DATE)

Friday 7 June 2013

Disable browser cache in ASP.NET MVC

First you need to create a custom action filter. For that you need to inherit  the class from ActionFilterAttribute.


  public class CustomActionFilterAttribute : ActionFilterAttribute
    {
       public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            var cache = filterContext.HttpContext.Response.Cache;
            cache.SetCacheability(HttpCacheability.NoCache);
            cache.SetRevalidation(HttpCacheRevalidation.ProxyCaches);
            cache.SetExpires(DateTime.Now.AddYears(-5));
            cache.AppendCacheExtension("private");
            cache.AppendCacheExtension("no-cache=Set-Cookie");
            cache.SetProxyMaxAge(TimeSpan.Zero);
        }

    }


To Implement above Action filter to any controller or to any particular action, you need to decorate controller or action as shown below:
   [CustomActionFilter]
    public class DemoController : Controller

    {
        ..Your Code..
    }


In MVC4, to disable browser caching across all controllers, but retain it for anything not served by a controller, add this to FilterConfig.RegisterGlobalFilters:
filters.Add(new  CustomActionFilterAttribute ());

Friday 24 May 2013

Custom ASP.NET MVC Authorize Attribute

AuthorizeAttribute allows you to secure controller actions. The Authorize attribute lets you indicate that authorization is restricted to predefined roles or to individual users. This gives you a high degree of control over who is authorized to view any page on the site.


public class CustomAuthorizeAttribute : AuthorizeAttribute
    {
        // Custom property as you can get Page name which is passed from controller
        public string AccessLevel { get; set; }
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            if (httpContext == null)
                throw new ArgumentNullException("httpContext");

            if (!httpContext.User.Identity.IsAuthenticated)
                return false;
            else
            {
                //Check Roles
                HttpCookie authCookie =          httpContext.Request.Cookies[FormsAuthentication.FormsCookieName];
                if (authCookie == null || authCookie.Value == "")
                {
                }
                FormsAuthenticationTicket authTicket = null;
                try
                {
                    authTicket = FormsAuthentication.Decrypt(authCookie.Value);
                }
                catch
                {
                }        
                // retrieve roles from UserData
                string[] roles = authTicket.UserData.Split(';');
            }                
            return true;
    }


Here I just override the AuthorizeCore methods of AuthorizeAttribute class. Now, you have to decorate your controller or action with this custom attribute

[CustomAuthorize(AccessLevel = "DemoIndex")]
 public ActionResult DemoIndex()
{
       return View();
}


You can redirect an unauthorised user in your custom AuthorisationAttribute by overriding the HandleUnauthorizedRequest method:

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result = new RedirectToRouteResult(
                    new RouteValueDictionary(
                        new
                            { 
                                controller = "Error", 
                                action = "Unauthorised" 
                            })
                    );
    }