ASP.Net, C#, Cross Domain, jQuery, jQuery AJAX

Using CORS in ASP.NET MVC Web API

Cross-site HTTP requests are HTTP requests for resources from a different domain than the domain of the resource making the request. For instance, a resource loaded from Domain A (http://domaina.example) such as an HTML web page, makes a request for a resource on Domain B (http://domainb.foo), such as an image, using the img element (http://domainb.foo/image.jpg). This occurs very commonly on the web today — pages load a number of resources in a cross-site manner, including CSS stylesheets, images and scripts, and other resources.

As an example –
If my Server is in http://www.shahjada.com and my client (which is hosted at http://www.shahjada-talukdar.com) calls that Server with an AJAX GET , it will give an error for Cross Domain Issue .

If the Client and Server is in the same server but in different port , It will also give Cross Domain error . Only if Client and Server are in same Address , it will work nicely.

Suppose , My ASP.net MVC WebAPI is hosted at http://www.shahjada-talukdar.com and my client is in http://www.shahjada.com , It will throw the error .
We can fix this issue by Using Cross Origin Resource Sharing (CORS) in ASP.NET Web API Server .

For that , We can create a CORS handler and add that handler to GlobalCOnfiguration’s MessageHandler .
My Cors handler is something like this :

public class CorsHandler : DelegatingHandler
    {
        const string Origin = "Origin";
        const string AccessControlRequestMethod = "Access-Control-Request-Method";
        const string AccessControlRequestHeaders = "Access-Control-Request-Headers";
        const string AccessControlAllowOrigin = "Access-Control-Allow-Origin";
        const string AccessControlAllowMethods = "Access-Control-Allow-Methods";
        const string AccessControlAllowHeaders = "Access-Control-Allow-Headers";

        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            bool isCorsRequest = request.Headers.Contains(Origin);
            bool isPreflightRequest = request.Method == HttpMethod.Options;
            if (isCorsRequest)
            {
                if (isPreflightRequest)
                {
                    HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
                    response.Headers.Add(AccessControlAllowOrigin, request.Headers.GetValues(Origin).First());

                    string accessControlRequestMethod = request.Headers.GetValues(AccessControlRequestMethod).FirstOrDefault();
                    if (accessControlRequestMethod != null)
                    {
                        response.Headers.Add(AccessControlAllowMethods, accessControlRequestMethod);
                    }

                    string requestedHeaders = string.Join(", ", request.Headers.GetValues(AccessControlRequestHeaders));
                    if (!string.IsNullOrEmpty(requestedHeaders))
                    {
                        response.Headers.Add(AccessControlAllowHeaders, requestedHeaders);
                    }

                    TaskCompletionSource<HttpResponseMessage> tcs = new TaskCompletionSource<HttpResponseMessage>();
                    tcs.SetResult(response);
                    return tcs.Task;
                }
                else
                {
                    return base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>(t =>
                    {
                        HttpResponseMessage resp = t.Result;
                        resp.Headers.Add(AccessControlAllowOrigin, request.Headers.GetValues(Origin).First());
                        return resp;
                    });
                }
            }
            else
            {
                return base.SendAsync(request, cancellationToken);
            }
        }
    }

Now Add that to Global.asax.cs like below :

GlobalConfiguration.Configuration.MessageHandlers.Add(new CorsHandler());

Now our Server is ready to handle any Cross Domain Client’s Call .

Cheers 🙂

Standard
ASP.Net, C#

Create a Custom GroupBox for selecting multiple choice in ASP.Net and C#

Many a time , We need to create a control for selecting Multiple Inputs in our Web Applications .

I am gonna show a demo how we can create a GroupBox type thing to select multiple items and Get those values in server side .

Lets see an example …

First see the image below :

Custom GroupBox for selecting multiple choice in ASP.Net and C#

Custom GroupBox for selecting multiple choice in ASP.Net and C#

If our requirement is like – User wants to see the report for all the Tasks which are in Open and Close Status.
So User can easily select multiple options .

So Here is my mark up code below :::

<asp:GridView ID="gridTicketStatus" runat="server" AutoGenerateColumns="false">
                <Columns>
                    <asp:TemplateField HeaderText="">
                        <ItemTemplate>
                            <asp:CheckBox ID="selectCheckBox" runat="server" />
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="Id" Visible="false">
                        <ItemTemplate>
                            <asp:Label ID="lblStatusId" runat="server" Text='<%#Bind("ID") %>'></asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="Select Status">
                        <ItemTemplate>
                            <asp:Label ID="lblTaskStatus" runat="server" Text='<%#Bind("TaskStatus") %>'></asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>

Here I used a ASP.Net Grid which gets the status from the Database and Binds the Status.And I used another CheckBox , that’s how we can create any custom control . If we also need any DropDown inside it, we can easily add the DropDown with it as same way .

The Grid binding code in C# is like :::

DataTable dtStatus = TaskStatusGateway.GetAllTaskStatuses();
            gridTicketStatus.DataSource = dtStatus;
            gridTicketStatus.DataBind();

And after clicking the Button we can easily get all the selected Statuses by doing like below.

List<int> checkedStatus = new List<int>();

            if (gridTicketStatus.Rows.Count > 0)
            {
                for (int i = 0; i < gridTicketStatus.Rows.Count; i++)
                {
                    if (((CheckBox) (gridTicketStatus.Rows[i].FindControl("selectCheckBox"))).Checked)
                    {
                        int id = Convert.ToInt32(((Label) gridTicketStatus.Rows[i].FindControl("lblStatusId")).Text);
                        checkedStatus.Add(id);
                    }
                }
            }

So we are done .

Cheers 🙂

Standard
ASP.Net, C#, JavaScript, jQuery, jQuery AJAX

How to Call ASMX WebService using HTTP GET with jQuery AJAX

By Default , WebMethod of ASMX is not allowed to be called using HTTP GET . So we will see a short demo here . Our HTML Markup of the aspx page is :

<asp:DropDownList ID="DropDownList2" runat="server" Width="150">
           <asp:ListItem Text="Select" Value="-1" />
        </asp:DropDownList>

We will fill this DropDown By calling ASMX Service’s WebMethod using HTTP GET with jQuery Ajax . My Client Code is like below :::

var DropDownList2 = $("#<%= DropDownList2.ClientID %>");
         

         $.ajax({
                type: "GET",
                url:"<%=ResolveUrl("~/MyWebService.asmx") %>/GetAllProjectName",
                data:"{}",
                contentType:"application/json; charset=utf-8",
                dataType:"json",
                success: function(response){
                        var projects = response.d;
                        $.each(projects,function(index,project){
                            DropDownList2.append('<option value="'+ project.ProjectId +'" >' + project.ProjectName + '</option>');                        
                        });
                 }
         });

My Server side code of the WebService is :::

[WebMethod]
         [ScriptMethod(UseHttpGet = true)]
         public List<ProjectOfEmployee> GetAllProjectName()
         {
             return GetProjectName();   
         }

Remember to add the below part of course

[ScriptMethod(UseHttpGet = true)]

Otherwise , It will give 500 Internal Server Error .

So now you are done 🙂 Cheers

Standard
ASP.Net, C#, JavaScript, jQuery, jQuery AJAX

jQuery Ajax in Action with ASP.Net aspx Page

Most of the time , We call our custom WebServices/REST Services/Third Party REST APIs from any jQuery AJAX based HTTP Verb . But we can also call direct ASP.Net Form Page( which is aspx page ) using jQuery AJAX .

Here is how we can call ASPX page from another ASPX page’s AJAX Method.

For this example , I have used two ASPX page –

1.AjaxCheckPage.aspx ::: From this page I am gonna call another ASPX Page
2.jQueryAjaxData.aspx ::: This Page will be called by jQuery AJAX

HTML Markup of my AjaxCheckPage.aspx is like below :

<input type="button" id="ajaxButton" value="Load Data using jQuery Ajax" />   

     <div id="divResult"></div>

Ajax calling code of this Page is —

    <script language="javascript" type="text/javascript">

        $("#ajaxButton").click(function () {

            $.ajax({

                type: "POST",
                url: "jQueryAjaxData.aspx",
                data: "a=2&b=3",
                success: function (data) {
                    $("#divResult").text(data);
                }

            });

        });
    
    </script>

So Now , am doing like – If any Data comes from jQueryAjaxData.aspx , that means after successful , am binding the data to the DIV :

Now lets go another Page jQueryAjaxData.aspx from which the Data is gonna come .

protected void Page_Load(object sender, EventArgs e)
        {
            if (Request.Form["a"] != null && Request.Form["b"] != null)
            {
                int a = int.Parse(Request.Form["a"]);
                int b = int.Parse(Request.Form["b"]);
                int sum = a + b;
                
                Response.Write("The Sum is : " + sum);
            }
        }

jQuery Ajax in Action with ASP.Net aspx Page

jQuery Ajax in Action with ASP.Net aspx Page

So you can see , when I click the button then It request a POST to jQueryAjaxData.aspx page and am also passing Form Data as you can see it inside the picture above .

So , this is how , we can call ASPX page from jQuery AJAX POST .

Cheers 🙂

Standard
ASP.Net, C#, SQL Server

Get Identity Column Value just after Inserting a row in MS SQL Server Table

Many a time , We need to get the auto Incremented Identity Column value just after Inserting/Saving a row to a Table in MS SQL Server.

In my Case of this Example, When I Insert a New Project to my tblProjects Table , I want the ID column value( which is basically auto incremented Identity Column in SQL Server) of my inserted Row .

For this , TSQL provides us a way to do that like below –

SELECT SCOPE_IDENTITY()

So in C# , our code can be like below :::

Note : We can use StoredProcedue Which is better practice .Then inside the SP ,we will use the code mentioned.

public static int CreateProject(Project projectObj)
        {
            string insertProjectQuery = "INSERT INTO tblProjects VALUES('" + projectObj.ProjectName + "','" + projectObj.TblCustomerId + "','" + projectObj.BClosed + "') SELECT SCOPE_IDENTITY() As ProjectId";
            DataTable dt = QueryGateway.GetDataThroughDataTable(insertProjectQuery);
            return  Convert.ToInt32(dt.Rows[0]["ProjectId"]);
        }

Cheers

Standard
ASP.Net, C#, RDLC

RDLC : Web.config Settings for ReportViewer

We, .Net Developers always do many kind of reports using RDLC . But while developing , we get the below error If we do not add web.config entries correctly .

We may get runtime error like below :::

The Report Viewer Web Control HTTP Handler has not been registered in the application’s web.config file

add name=”ReportViewerWebControlHandler” preCondition=”integratedMode” verb=”*” path=”Reserved.ReportViewerWebControl.axd” type=”Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”

To resolve this issue , add these below Nodes to Web.Config.

  <system.webServer>
    <handlers>
      <add name="ReportViewerWebControlHandler" preCondition="integratedMode" verb="*" path="Reserved.ReportViewerWebControl.axd" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </handlers>
  </system.webServer>

And

    <system.web>

    <httpHandlers>
      <add path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler,   Microsoft.ReportViewer.WebForms, Version=10.0.0.0,   Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" validate="false"  />
    </httpHandlers>

Cheers 🙂

Standard
ASP.Net, C#

Time Localization using .Net TimeZone API in C#

A time zone is a geographical region in which the same time is used.

You can use the TimeZone class to retrieve information about the current time zone, and to convert times from local time to Coordinated Universal Time (UTC) or vice versa. However, you cannot use the TimeZone class to represent time zones other than the local zone or to handle date and time conversions from one time zone to another. For this purpose, use the TimeZoneInfo class. You can use this class to retrieve information on any time zone defined on the local system, to create custom time zones, and to convert times from one time zone to another.
The TimeZone class supports only a single daylight saving time adjustment rule for the local time zone. As a result, the TimeZone class can accurately report daylight saving time information or convert between UTC and local time only for the period in which the latest adjustment rule is in effect. In contrast, the TimeZoneInfo class supports multiple adjustment rules, which makes it possible to work with historic time zone data.

Lets go to an example .

If you have an Application which will be used in so many Countries and every User comments on a Note in your Site and When Another User logs in , He wants to see the comment Time in His own TimeZone , not in your time Zone . Like If a person from Switzerland comments on a Note at 9.00 AM , after that when I log in I want to see that in my Time Zone Of Bangladesh which should be 1.00 PM . I used same concept few years back in one of My Sites and its awesome 🙂

Its better to Keep the DateTime Columns as UTC Date and Then convert to User’s own TimeZone By his TimeZoneId using .Net TimeZone API .

Your Site Can have a UI which would be used by The User to Set his Own Time Zone when he gets Registered Into your Site. So That UI can be like below :::

ddlTimeZone

And You can easily populate The Time Zone List DropDown .

Here is Asp.Net markup for that :

<asp:DropDownList ID="ddlTimeZoneId" runat="server">
                </asp:DropDownList>

And Binding DropDown Code will be like :::

private void LoadTimeZoneDropDown()
        {
            ddlTimeZoneId.DataSource = clsTimeZone.GetTimeZones();
            ddlTimeZoneId.DataTextField = "TimeZoneName";
            ddlTimeZoneId.DataValueField = "TimeZoneID";
            ddlTimeZoneId.DataBind();
        }

This clsTimeZone is my custom Class which is using .Net APIs . And I used This below Method to Get the Time Zone List .

public static Collection<structTimeZone> GetTimeZones()
        {
            Collection<structTimeZone> structTimeZoneColl = new Collection<structTimeZone>();

            ReadOnlyCollection<TimeZoneInfo> timeZoneInfos = TimeZoneInfo.GetSystemTimeZones();
            foreach (TimeZoneInfo timeZoneInfo in timeZoneInfos)
            {
                structTimeZoneColl.Add(new structTimeZone { TimeZoneName = timeZoneInfo.DisplayName, TimeZoneID = timeZoneInfo.Id });
            }
            return structTimeZoneColl;
        }

public struct structTimeZone
    {
        public string TimeZoneName { get; set; }
        public string TimeZoneID { get; set; }
    }

From here , User can set his Own Time Zone from the List which .Net Framework or Windows or Microsoft supports.

So your User Table should have Column like this :::

TimeZoneIdColumn

So your Initial Setup is done .

Now When Any User from Switzerland saves Note to Notes Table , then don’t Use Local DateTime rather use UTC Time .

It can be done by using this SQL In your StoredProcedure .

GETUTCDATE()

So your DB Table will hold UTC , so you can easily convert that to any Localized format , to any Time Zone by your TimeZoneId of that User .

So When need to show the Time to UI , just call This method which will return Local time Zone Info . In my Case I did something like this :::

DateTime localTime = clsTimeZone.ConvertToLocalTimeFromUtcTime(utcDate, timeZoneId);

And the implementation of the Method is just simple like below :::

public static DateTime ConvertToLocalTimeFromUtcTime(DateTime utcDate, string timeZoneId)   
        {
            TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
            DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(utcDate, cstZone);
            return cstTime;
        }

Just Show that Local Time To The UI .
So you are done 🙂

Cheers

Standard