European ASP.NET 4.5 Hosting BLOG

BLOG about ASP.NET 4, ASP.NET 4.5 Hosting and Its Technology - Dedicated to European Windows Hosting Customer

European ASP.NET 4 Hosting :: Session State in ASP.NET 4.0

clock September 27, 2011 06:20 by author Scott

This post explains about Shrinking session state in ASP.NET 4.0.

ASP.NET Provides two options for storing session state for web applications.

1. Out of process session state
2. MS SQL server session state

In both the options session-state providers stores the data out side the web application   worker process. Session state has to be serialized before it sends it to the external storage.

ASP.NET 4.0 introduces a new compression option for both out-of-process session state providers. We can set the compressionEnabled option in configuration file to true. ASP.NET will compress the session state by using the .NET Framework System.IO.Compression.GZipStream class.

We can configure the session state as follows

<sessionState
    mode="SqlServer"
    sqlConnectionString="data source=dbserver;Initial Catalog=aspnetstate"
    allowCustomSqlDatabase="true"
    compressionEnabled="true"
/>


Advantage: With this addition of attribute to web.config file there is substantial reduction in the size of serialized session-state data.



European ASP.NET 4 Hosting :: Visualize Response.RedirectPermanent in ASP.NET 4

clock September 21, 2011 08:54 by author Scott

In ASP.NET 4.0 there are new features that enable developer to make SEO friendly websites very easily. And if you google out, you will find plenty of article which explain this feature. But I am more interested in Response.RedirectPermanent. As the name suggest it is used to redirect permanently moved resources to new location. And most of all articles on the net just explain this with some example. But how can we visualize that whether resource is redirected permanently or not. So here is the answer for that. I have used FireBug to examine the same.

Whenever we redirect with Response.Redirect, we can see following activity in FireBug console.



As we can see that page which issues Response.Redirect its response status code 302(Found) which means requested url(default.aspx) is found but it is temporarily moved to about.aspx. More information on HTTP status code can be found
here.

Now whenever we redirect with Response.RedirectPermanent, we can see following activity in FireBug console.



As we can see that page which issues Response.RedirectPermanent its response status code 301(Moved Permanently) which means requested url(default.aspx) is moved Permanently to about.aspx. 301 status code is used by search engine crawler to update search index to new moved information.

I hope information provided here would be more helpful to distinguish between Response.Redirect and Response.RedirectPermanent.



European ASP.NET 4 Hosting:: Raising Server side event from JavaScript in ASP.NET

clock September 16, 2011 06:34 by author Scott

Well, knowing internal structure of an ASP.NET event system can always be an element of fun and interests. Recently I came across to a requirement to generate a server side event on a page directly from Javascript. There are a couple of approaches available with the existing models (like ICallbackEventHandler etc) but these will put additional pressure to the page and also does not use the existing code already present. So I thought to put a script that could use all the existing code and work similar to what happens in background.

You might know when a page is processed, it generates two hidden controls. viz. EventName and EventValue. The eventName is used to send the name of the event that the client is going to generate in the server side. As you know, ASP.NET is a stateless protocol. Hence everything that is genenrated in the server side to produce your page, will be disposed once it is done. Hence you need to postback the whole page again to communicate and during this phase, the ASP.NET server side page generates the respective events on various controls which is specified on the eventName.

The eventValue on the other hand will hold additional arguments that you need to send to the server for the particular event. The ASP.NET page will generate the event automatically during the rendering of the page in the server side.

Now here, I am going to build my own event so I need to do this myself. Lets see how :

public delegate void CustomEventHandler(string message);
public event CustomEventHandler public void OnCustomEventRaised(string message)
        {
            if (this.CustomEvent != null)
                this.CustomEvent(message);
        };

Say I have to generate this event from the client side. As this event is created totally by me, I need to configure it myself, such that it generates it when passed with special attribute. I personally thought it would be easier to understand this for a newbie if I write it under Page_Load, but you are free to generate this event as your wish (following your own pattern I guess). Now lets look the code to understand

First of all, I create two hidden field in the page with runat =”server”

<asp:HiddenField ID="hidEventName" runat="server" />
  <asp:HiddenField ID="hidEventValue" runat="server" />

This will ensure that the hiddenfields will be available from server side. Now inside Page_Load, I write code to raise the event :


public void Page_Load(…)
{
   if (hidEventName.Value == "CustomEvent")
   {
      hidEventName.Value = ""; //It is essential reset it and remove viewstate data
      OnCustomEventRaised(hidEventValue.Value);
   }
}

public void OnCustomEventRaised(string message)
{
    if (this.CustomEvent != null)
        this.CustomEvent(message);
}

So eventually I am raising the eventhandler once the page is posted back from the client side. Now to raise the event from the client side, let me add a javascript :

function RaiseEvent(pEventName, pEventValue) {

        document.getElementById('<%=hidEventName.ClientID %>').value = pEventName;
        document.getElementById('<%=hidEventValue.ClientID %>').value = pEventValue;

        if (document.getElementById('<%=MyUpdatePanel.ClientID %>') != null) {
            __doPostBack('<%=MyUpdatePanel.ClientID %>', '');
        }
    }

So basically I am posting back the whole page from the client side using the __doPostBack method already present for every page. Here I have used my UpdatePanelId to ensure that postback is generated from my UpdatePanel.

Now from javascript if I call :

RaiseEvent(‘CustomEvent’, ‘Hello from server’);

It will eventually call the server with my custom message.



European ASP.NET 4 Hosting :: ASP.NET 4 and MySQL Membership Provider

clock September 12, 2011 07:09 by author Scott

Recently I had to setup an ASP.NET MVC 2 project which would utilize the built-in membership of ASP.NET. However, I didn't have access to a MS SQL database, so I had to use a MySQL data provider instead. The following is a quick guide on how to get it setup.

First, you need to download the MySQL Connector/Net from
this page. This makes it possible to connect to MySQL databases from .NET applications and gives you access to the ADO.NET interfaces. I choose to download the latest development release (at the time of writing) Connector/Net 6.3.3 beta, as this fully integrates with Visual Studio 2010 which the latest public release (6.2.3 at the time of writing) does not. Download BOTH the source (mysql-connector-net-6.3.3-src.zip) and the installation file (mysql-connector-net-6.3.3.zip). I will explain why in a second.

Once you've downloaded both files, extract them and install the connector. Now, normally when using the membership provider, the database tables/schemas are automatically created. The MySQL membership provider does this as well, unfortunately it just doesn't do it right. At least it didn't work for me. Instead, you have to create the databases semi-manually. Go to the location where you extracted the source and browse to the following folder "\MySql.Web\Providers\Properties". In this folder you will see a number of .sql files: schema1.sql, schema2.sql, schema3.sql, schema4.sql, schema5.sql and schema6.sql. Run each of these, in turn and starting with schema1.sql, against your MySQL database.

Now, fire up Visual Studio 2010 and open your application. Add a reference to MySql.Web.dll which can be found in the directory you installed the Connector, e.g. C:\Program Files\MySQL\MySQL Connector Net 6.3.3\Assemblies\v2.0

Next, unless you haven’t done this already, add your MySQL connection string to the configuration/connectionStrings element in the Web.config, e.g.:

<connectionStrings> 
    <add name="MySQLConn" connectionString="Server=SERVERADDRESS;Database=DATABASENAME;Uid=USERNAME;Pwd=PASSWORD;"/> 
</connectionStrings> 

Finally, open up your Web.config and add these lines to the <system.web> element:

<membership defaultProvider="MySqlMembershipProvider"> 
  <providers> 
    <clear/> 
    <add name="MySqlMembershipProvider"                   
   
 type="MySql.Web.Security.MySQLMembershipProvider,MySql.Web,Version=6.3.3.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d"   

    autogenerateschema="true" connectionStringName="MySQLConn"   
    enablePasswordRetrieval="false" enablePasswordReset="true"   
    requiresQuestionAndAnswer="false" requiresUniqueEmail="false"   
    passwordFormat="Hashed" maxInvalidPasswordAttempts="5"   
    minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0"   
    passwordAttemptWindow="10" passwordStrengthRegularExpression=""   
    applicationName="/" /> 
  </providers> 
</membership> 

<profile defaultProvider="MySqlProfileProvider"> 
  <providers> 
    <clear/> 
    <add name="MySqlProfileProvider"   
    type="MySql.Web.Profile.MySQLProfileProvider,MySql.Web,Version=6.3.3.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d"   
    connectionStringName="MySQLConn" applicationName="/" /> 
  </providers> 
</profile> 

<roleManager enabled="true" defaultProvider="MySqlRoleProvider"> 
  <providers> 
    <clear /> 
    <add name="MySqlRoleProvider"   
    type="MySql.Web.Security.MySQLRoleProvider,MySql.Web,Version=6.3.3.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d"   
    connectionStringName="MySQLConn" applicationName="/" /> 
  </providers> 
</roleManager> 

Now, you've (hopefully) got a fully working MySQL membership provider. To test it, go to Project > ASP.NET Configuration and go to the Security tab. Here you should be able to manage users and roles.


NOTE: Make sure you enter the correct connectionstring name, version number and PublicKeyToken in the Web.config.



European ASP.NET Hosting :: Create Membership tables in another database than the standard aspnetdb.mdf

clock September 8, 2011 06:55 by author Scott

When you start creating a new ASP.NET 2.0 site with Visual Studio 2005 or Visual Web Developer Express (VWD) and want to start using it you'll notice that a new file in the App_Data folder gets created besides your own database, namely the aspnetdb.mdf file. This extra database holds all the tables and stored procedures to let Membership, Roles, Profile etc run smoothly.

However a problem arises when you don't want to use that dedicated new database when you want to deploy to your live webserver, certainly not when you use a host that only offers one database and charges you extra for another database. Luckely you can control things more when using the dedicated
aspnet_regsql tool that ships with the .NET 2.0 framework.

What I'm about to describe in this article is how to use that tool to generate a SQL script that you can use to run on your other database with a tool like SQL Server Management Studio (SSMS). In this example I'll be using the installed Northwind database on my localhost developer machine.

Just start up a new DOS box by going to Start | Run and type in cmd followed by enter. In Windows Vista you push the blue windows logo button and in the field with the text Start Search you type in cmd followed by ctrl + shift + enter. The reason for that combination is that you must run it under Admin privileges or else the to be generated file doesn't get writed to disk.
A new DOS box will appear and you just navigate to the following directory/folder:

Windows\Microsoft.NET\Framework\v2.0.50727\

If you're not used to using DOS you can navigate to it by typing this in the DOS box: cd \windows\Microsoft.net\framework\v2.0.50727 followed by enter.

Then you type in this line: aspnet_regsql.exe -E -S localhost -d Northwind -A all -sqlexportonly c:\membership.sql again followed by enter. At the location c:\ a new file gets generated: membership.sql.



The Northwind name in the parameter list is later on used to set the db name in the generated sql file: SET @dbname = N'Northwind'

Once generated you can use/tweak this file to be used in SSMS to get executed and to install everything needed in the database.

Ok, up untill now we focussed on getting everything ready on the database side but we also have to let our ASP.NET 2.0 application know that we're pointing out to another database than the default one. The solution for this is to override the default settings for the LocalSqlServer connectionstring which can be found in the machine.config file.

<add name="LocalSqlServer"
connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;
AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
providerName="System.Data.SqlClient" />

To override that you open the web.config file in your application which can be normally found in the root of the application. Go to the <connectionStrings> element.


<connectionStrings>
    <remove name="LocalSqlServer"/>
    <add name="LocalSqlServer" connectionString="The connection string to your
                         (new) database" providerName="System.Data.SqlClient" />
</connectionStrings>

Notice the second line where you call the remove statement. This is needed in order to be able to override the LocalSqlServer connection string!

If you're in need of a little help to get your connection string right there's a dedicated site: http://www.connectionstrings.com/.

If you're interested in creating one dedicated database for multiple applications you can also check out Scott Guthrie's post: Configuring ASP.NET 2.0 Application Services to use SQL Server 2000 or SQL Server 2005.



European ASP.NET Hosting :: Changing ASP.net Temporary Files Folder

clock August 30, 2011 06:35 by author Scott

One of my client was having problems with the small space on the C drive on a server machine which was hosting a ASP.net application. There were few errors in the server error about “No enough space”.Though I would say that in ideal situation it would be best to increase the space on the C: drive as most of the other Operating System related applications also reply on the free space on C: drive, when there is no other easy way of increasing the space on C: drive, administrator can relocate the temporary files folder created by ASP.net.

Please note that ASP.net create a compile version of the site and stores it in its default temporary ASP.net folder. This is usually %Windows Install Folder%\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files (For ASP.Net 2.0). This folder can grow very fast in case web server has large ASP.net sites hosted on that server. Fortunately, ASP.net provides a simple way to change this location. This is stored in the web.config file and can defined in the Global web.config (placed at %Windows Install Folder%Microsoft.NET\Framework\v2.0.50727\CONFIG). To change this path add the new full folder path in the Compilation section of the configuration file. Here is a sample of how this looks like (this must be under System.Web section):

<compilation tempDirectory=“E:\ASP.Net Temporary Folder\” debug=“false“>

One can find the documentation of all different sections of ASP.net configuration file at:
http://msdn2.microsoft.com/en-us/library/b5ysx397(VS.71).aspx

In case when Internet is not available, or you just need a quick reference, there is also a small helpful file in the configuration folder. This file is named “web.config.comments” and is in the CONFIG folder of the ASP.net framework folder.



European ASP.NET 4 Hosting :: Error Handling Mechanisms in ASP.NET Application

clock August 29, 2011 17:25 by author Scott

In ASP.NET application we need to consider below factors while creating error handling ability in system

- Show User friendly message in UI
- Log all detail level error
- Log error process should be very simple and generic so there are minimum chances of the error comes in log generation process and that should be easy to accessible to each user.

i.e. if we are storing login in database and error comes related to database connectivity then we never get any kind of logs and also that is difficult to retrieve that log

Show User Friendly message in UI:


Add below tags in your web.config file



Also need to add Errorpage.aspx and pagenotfound.aspx(if required) with user friendly messages.

Log all detail level error

For maintain each error log we need to add below code in global.asax page in Application_Error event.


void Application_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError().GetBaseException();
string PageUrl = Request.Url.ToString();

string strLogFile = Server.MapPath(@"~\ErrorLog\LogFile_" + DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + ".txt");
ErrorHnadling.ErrorHandling(ex, strLogFile, Request.Form.ToString(), PageUrl);
}

So when ever error occurs this event fires and error is logged.


Error Log Process

We have implemented error log process in Errorhadling class with errorhandling methods with all error details.

We are storing error in text file with predefine web root folder with todays date as naming convention so any time user can access that file data by browsing it by web directory (with predefine name by date)

Below are the class for error handling.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.IO;
/* Created By : Amit Patel
* Created Date : 21th Feb 2011
* Description : Error Handling for application level
*/
namespace Common
{
public class ErrorHnadling
{
///
/// Log Exception Log file (log file is maintain based on Date
///

/// Exception Message
/// Log File
/// Request Form name
/// Query String Name
public static void ErrorHandling(Exception ex, string strLogFile, string strFormName, string strQueryString)
{

StreamWriter oSW;
if (File.Exists(strLogFile))
{
oSW = new StreamWriter(strLogFile, true);
}
else
{
oSW = File.CreateText(strLogFile);
}

oSW.WriteLine("================================" + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToLongTimeString() + "================================");
oSW.WriteLine("MESSAGE : " + ex.Message);
oSW.WriteLine("SOURCE : " + ex.Source);
oSW.WriteLine("TARGETSITE : " + ex.TargetSite);
oSW.WriteLine("STACKTRACE : " + ex.StackTrace);
oSW.WriteLine("INNEREXCEPTION : " + ex.InnerException);
oSW.WriteLine("FORM : " + strFormName);
oSW.WriteLine("QUERYSTRING : " + strQueryString);
oSW.Close();
}
///
/// Log Exception Log file (log file is maintain based on Date
///

/// Exception Message
/// Log File
/// Request Form name
/// Query String Name
/// Data for Error Handling (user id or any other session variable
public static void ErrorHandling(Exception ex, string strLogFile, string strFormName, string strQueryString, string strData)
{

StreamWriter oSW;
if (File.Exists(strLogFile))
{
oSW = new StreamWriter(strLogFile, true);
}
else
{
oSW = File.CreateText(strLogFile);
}

oSW.WriteLine("================================" + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToLongTimeString() + "================================");
oSW.WriteLine("MESSAGE : " + ex.Message);
oSW.WriteLine("SOURCE : " + ex.Source);
oSW.WriteLine("TARGETSITE : " + ex.TargetSite);
oSW.WriteLine("STACKTRACE : " + ex.StackTrace);
oSW.WriteLine("INNEREXCEPTION : " + ex.InnerException);
oSW.WriteLine("FORM : " + strFormName);
oSW.WriteLine("QUERYSTRING : " + strQueryString);
oSW.WriteLine("Data : " + strData);
oSW.Close();
}
}
}

Also we have added another method to capture application/session related data. That will help if any specific error comes on special data or specific user.

Hope you will enjoy with code to trace any error in production application.



European ASP.NET 3.5 Hosting :: Using the DataContractJsonSerializer in .NET 3.5

clock August 24, 2011 08:23 by author Scott

In ASP.NET AJAX Extensions v1.0 for ASP.NET 2.0 there is the JavaScriptSerializer class that provides JSON serialization and deserialization functionality. However, in .NET 3.5 the JavaScriptSerializer has been marked obsolete. The new object to use for JSON serialization in .NET 3.5 is the DataContractJsonSerliaizer object. I'm still new to the DataContractJsonSerializer, but here's a summary of what I've learned so far...

Object to Serialize

Here's a simple Person object with First Name and Last Name properties.

public class Person
{
    public Person() { }
    public Person(string firstname, string lastname)
    {
        this.FirstName = firstname;
        this.LastName = lastname;
    }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}


Now in order to serialize our object to JSON using the DataContractJsonSerializer we must either mark it with the Serializable attribute or the DataContract attribute. If we mark the class with the DataContract attribute, then we must mark each property we want serialized with the DataMember attribute.

/// Marked with the Serializable Attribute

[Serializable]
public class Person
{
    public Person() { }
    public Person(string firstname, string lastname)
    {
        this.FirstName = firstname;
        this.LastName = lastname;
    }
    public string FirstName { get; set; }
    public string LastName { get; set; }

}

/// Marked with the DataContact Attribute
[DataContract]
public class Person
{
    public Person() { }
    public Person(string firstname, string lastname)
    {
        this.FirstName = firstname;
        this.LastName = lastname;
    }

    [DataMember]
    public string FirstName { get; set; }

    [DataMember]
    public string LastName { get; set; }
}


Serialization Code

Here's the most basic code to serialize our object to JSON:

Person myPerson = new Person("Scott", "Walker");

/// Serialize to JSON
System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(myPerson.GetType());
MemoryStream ms = new MemoryStream();
serializer.WriteObject(ms, myPerson);
string json = Encoding.Default.GetString(ms.ToArray());


Our resulting JSON looks like this:

/// Result of Person class marked as Serializable
{"<FirstName>k__BackingField":"Scott","<LastName>k__BackingField":"Walker"}


/// Result of Person class marked as DataContract with
/// each Property marked as DataMember
{"FirstName":"Scott","LastName":"Walker"}


As you can see the first serialization with the class marked with the Serializable attribute isn't quite what we were expecting, but is still JSON. This serialization actually isn't compatible with the client-side JSON Serializer in ASP.NET AJAX.

As you can see the second serialization with the class marked with the DataContract attribute is exactly what we were expecting, and is the same JSON that the old JavaScriptSerializer object would have generated. This is the method of JSON serialization using the DataContractJsonSerializer that you'll need to do if you are going to pass the resulting JSON down to the client to be consumed with ASP.NET AJAX.

Deserialization Code

Here's the most basic code to deserialize our object from JSON:

Person myPerson = new Person();

MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json));
System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(myPerson.GetType());
myPerson = serializer.ReadObject(ms) as Person;
ms.Close();


Controlling the property names in the resulting JSON

When using the DataContract and DataMember attributes, you can tell the DataMember attribute the specific name you want that property to have within the JSON serialization by setting its "Name" named parameter.

Here's an example that will give the name of "First" to the "FirstName" property within the JSON serialization:

[DataMember(Name = "First")]
public string FirstName { get; set; }


The resulting JSON looks like this:

{"First":"Scott","LastName":"Walker"}

Here's the code for some Helper methods using Generics to do all the dirty work for you

using
System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

public class JSONHelper
{
    public static string Serialize<T>(T obj)
    {
        System.Runtime.Serialization.Json.DataContractJsonSerializer
serializer = new
System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType());
        MemoryStream ms = new MemoryStream();
        serializer.WriteObject(ms, obj);
        string retVal = Encoding.Default.GetString(ms.ToArray());
        ms.Dispose();
        return retVal;
    }

    public static T Deserialize<T>(string json)
    {
        T obj = Activator.CreateInstance<T>();
        MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json));
        System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType());
        obj = (T)serializer.ReadObject(ms);
        ms.Close();
        ms.Dispose();
        return obj;
    }
}

/// Our Person object to Serialize/Deserialize to JSON
[DataContract]
public class Person
{
    public Person() { }
    public Person(string firstname, string lastname)
    {
        this.FirstName = firstname;
        this.LastName = lastname;
    }

    [DataMember]
    public string FirstName { get; set; }

    [DataMember]
    public string LastName { get; set; }
}


What Assembly References does my application need for this?

From the namespace that contains DataContractJsonSerializer you can probably tell that you need to add a reference to the System.Runtime.Serialization assembly. However, you also need to add a reference to the System.ServiceModel.Web assembly.



European ASP.NET 4 Hosting :: How to Integrate Google Maps with ASP.NET Page

clock August 8, 2011 08:16 by author Scott

This tutorial will describe how to integrate google maps to ASP.NET page.

1. Register Google Maps API key

You can download it from here
http://www.google.com/apis/maps/

2. Download the SubGurim Google Maps wrapper dll

Then, you need to download google maps wrapper at
http://en.googlemaps.subgurim.net/descargar.aspx.

3. Set up your aspx page

This is for the example:

<p style="text-align:right; margin-right:300px">
    Street Address:
    <asp:textbox ID="txtStreetAddress" runat="server" Width="150px" /><br />
    Suburb:
    <asp:textbox ID="txtSuburb" runat="server" Width="150px" /><br />
    Country:
    <asp:textbox ID="txtCountry" runat="server" Width="150px" /><br /><br />
    <asp:Button Text="Show Map" ID="lnkShowMap" runat="server" />
</p>

You need to add your Google API key to your web.config file like so:

<appSettings>
    <add key="googlemaps.subgurim.net" value="YourGoogleMapsAPIKeyHere" />
</appSettings>

And finally, you need to register the SubGurim wrapper at the top of your page (or in your web.config if you have a number of pages that display maps):

<%@ Register Assembly="GMaps" Namespace="Subgurim.Controles" TagPrefix="cc1" %>

4. Add code to display the map

Protected Sub lnkShowMap_Click(ByVal sender As Object, ByVal e As System.EventArgs)

        Handles lnkShowMap.Click
    Dim strFullAddress As String
    Dim sMapKey As String =
    ConfigurationManager.AppSettings("googlemaps.subgurim.net")
    Dim GeoCode As Subgurim.Controles.GeoCode

    ' Combine our address fields to create the full address.  The street,
    ' suburb and country should be seperated by  periods (.)
    strFullAddress = txtStreetAddress.Text & ". " & txtSuburb.Text
        & ". " & txtCountry.Text

    ' Work out the longitude and latitude
    GeoCode = GMap1.geoCodeRequest(strFullAddress, sMapKey)
    Dim gLatLng As New
Subgurim.Controles.GLatLng(GeoCode.Placemark.coordinates.lat,

        GeoCode.Placemark.coordinates.lng)
    ' Display the map
    GMap1.setCenter(gLatLng, 16, Subgurim.Controles.GMapType.GTypes.Normal)
    Dim oMarker As New Subgurim.Controles.GMarker(gLatLng)
    GMap1.addGMarker(oMarker)
End Sub

Done.  Great JOB.



European ASP.NET 4 Hosting :: Repeater within ASP.NET 2.0 Gridview

clock August 1, 2011 06:48 by author Scott

This article and code snippet here shows how to bind a repeater control and Gridview control to a relational data so the GridView and the Repeater control show related data.

Inserting a Repeater within Gridview is an easy task but to bind the headline in the GridViewand data items correspond to the particular head line into a Repeater control is a little bit trickier job. According to a requirement, I have to bind company name as headline and top four news of the company as its data items under the headline, again next company name and top four news of respective company and so on.

Here, I have to use a repeater control to bind news while I am binding company name in grid view. We can also make the company name as link button which on click, will navigate to corresponding page. For this we have to pass navigate URL for a company dynamically. We can do this by writing code in OnRowDataBound event of gridview. We can also make news row as link.

Mechanism

Take a GridView control and set its AutoGenerateColumns="False".  Put a label control within the GridView to bind company name. You can also use its BoundField.

Now, within the same ItemTemplate, place a repeater control and put one more label control within this repeater control to bind news of respective company. If you are using different ItemTemplate, then it will bind in another column, otherwise it will bind in the same column but in different rows as shown in fig. below.

Now it is your choice, whether you are interested to bind in same or different column. Here, I have used div tag, to separate company and their news rows. The div tag gives one more advantage i.e. we can apply CSS to a particular div for richer UI.

The complete source code is here.

      <div style="width:400px; font-family:Arial; font-size:small">
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" Width="100%" GridLines="None">
            <Columns>
                <asp:TemplateField>
                <ItemTemplate>
                    <div style="color:Blue;font-weight:bold">
                        <asp:Label ID="Label1" runat="server" Text='<%# DataBinder.Eval(Container.DataItem,"compname") %>'></asp:Label>
                    </div>
                    <asp:Repeater ID="Repeater1" runat="server" DataSource='<%#DataBinder.Eval(Container, "DataItem.InnerVal") %>'>
                    <ItemTemplate>
                    <div style="padding-left:20px; padding-top:5px">
                        <asp:Label ID="Label2" runat="server" Text='<%# DataBinder.Eval(Container.DataItem,"news") %>'></asp:Label>
                    </div>
                   
                    </ItemTemplate>
                    </asp:Repeater>
                    <div style="text-align:right">
                        <asp:HyperLink ID="link" runat="server">More</asp:HyperLink>
                    </div>
                </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
    </div>

It is obvious that we have to write some code in code behind to get the data from database.

I have used a stored procedure that returns two tables, i.e. for company name and news section. 

Now I am making a relation between these two tables in a DataSet, with column 'compname'.  And finally, binding the data in data controls.  

Here is the code on the page load event handler. As you can see from the binddat method, I get data in a DataSet from the database, sets a relation and sets the DataSource property of the GridView control to the DataSet. Rest data binding is done in the above ASP.NET code.

       protected void Page_Load(object sender, EventArgs e)
    {
        binddata();
    }

    // Function to bind data in data controls..
    public void binddata()
    {
        string str = "Data Source=VS-NAVINCHANDRA\\SQLEXPRESS;Initial Catalog=dbNavin;Integrated Security=SSPI"; // your connection string here
        SqlConnection con = new SqlConnection(str);
        DataSet ds = new DataSet();
        SqlDataAdapter da = new SqlDataAdapter("getCompNews", con); // name of your stored procedure,
        da.Fill(ds);

        ds.Relations.Add("InnerVal", ds.Tables[0].Columns["compname"], ds.Tables[1].Columns["compname"]);   // making a relation between two tables.
        GridView1.DataSource = ds.Tables[0];
        GridView1.DataBind();
    }

On clicking 'More' link button, it should redirect to page which shows all the news of that particular company. So, we have to set NavigateUrl property for this control dynamically. To do this, write the code given below. As I have passed company name in query string, you can very easily access respective company data from your table to display.

      protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            HyperLink lnkMore = (HyperLink)e.Row.FindControl("link");
            Label lbl=(Label)e.Row.FindControl("Label1");
            lnkMore.NavigateUrl = "~/Company.aspx?cmp="+lbl.Text;
        }
    }

As I have mentioned for stored procedure, so you must create a stored procedure that returns tables. If you don't want to create it, just copy and paste the stored procedure given below and compile it. Make sure that your database contains all tables and respective columns.

      Create Procedure [dbo].[getCompNews]

               as
               begin
               create table #Temp
              (
               compname varchar(50),
               news varchar(150)
               )

               Insert into #Temp
               select a.compname, b.news from Company as a
               inner join  CompNews as b on a.CompId=b.CompId order by compname
 
              
Select distinct compname from #Temp
               select * from #Temp
               end
               drop table #Temp

Here I am using stored procedure instead of using direct sql query. Offcourse a stored procedure is much better than a query.



About HostForLIFE.eu

HostForLIFE.eu is European Windows Hosting Provider which focuses on Windows Platform only. We deliver on-demand hosting solutions including Shared hosting, Reseller Hosting, Cloud Hosting, Dedicated Servers, and IT as a Service for companies of all sizes.

We have offered the latest Windows 2016 Hosting, ASP.NET Core 2.2.1 Hosting, ASP.NET MVC 6 Hosting and SQL 2017 Hosting.


Tag cloud

Sign in