How To Make A WebGrid Row Clickable

This snippet is one in a series showing how to use jQuery to enhance the behaviour of a Web Pages WebGrid. This example shows how to make an entire row clickable so that the user is taken to another page that displays details of the selected row.

This example makes use of the SQL CE 4.0 version of the Northwind database. It assumes that you have a layout page that references jQuery and includes a RenderSection call to an optional section named "script":

<!DOCTYPE html>

<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>@Page.Title</title>
        <script src="@"//code.jquery.com/jquery.min.js"type="text/javascript"></script>
        <link href="@Href("~/styles/site.css")" rel="stylesheet" />
        @RenderSection("script", required: false)
    </head>
    <body>
        @RenderBody()
    </body>
</html>

The main page gets data from the database, specifies some columns and an AJAX update container. It also includes the jQuery that makes rows clickable in the script section:

@{
    Page.Title = "Clickable Rows";
    var db = Database.Open("Northwind");
    var query = "SELECT * FROM Customers";
    var data = db.Query(query);
    var columns = new[]{"CustomerID", "CompanyName", "ContactName", "Address", "City", "Country", "Phone"};
    var grid = new WebGrid(data, ajaxUpdateContainerId: "grid", columnNames: columns);
}
<h1>Clickable Rows</h1>
<div id="grid">
    @grid.GetHtml(    
        tableStyle : "table",
        alternatingRowStyle : "alternate",
        headerStyle : "header"
    )
</div>
@section script{
<script type="text/javascript">
    $(function(){
        $('tbody tr').hover( function(){
            $(this).toggleClass('clickable');
        }).on('click', function(){
            location.href = '/Details/' + $(this).find('td:first').text();  
        }); 
    });
</script>       
}

The CSS for the 'clickable' style is defined as follows:

.clickable{
    cursor: pointer;
    background: #ffff99;
}

As the user runs their cursor (hovers) over the rows of data, the current row turns yellow and the the cursor changes to a hand with a pointing finger shape. This event handler has only been applied to the table rows within the tbody element, so that the table head and foot are not affected. At the same time, the row has a click event handler added, which navigates the user to a page called Details. The text content of the first cell in each row ('td:first') is appended to the URL as UrlData. Accordingly, clicking on the first row will take the user to Details/ALFKI. The code to retrieve and display the related details in this example is simple:

@{
    Page.Title = "Details";
    var db = Database.Open("Northwind");
    var query = "SELECT * FROM Customers WHERE CustomerID = @0";
    var data = db.QuerySingle(query, UrlData[0]);

}
<h1>Details</h1>
@foreach(var item in data.GetDynamicMemberNames()){
    <strong>@item:</strong> @data[item]<br />
}

A demo containing the source code is available here.

 

Date Posted:
Last Updated:
Posted by:
Total Views to date: 69114

7 Comments

- Jacob Fernandez

Thank you for this working tutorial. But I have things in my mind. Is it reusable? What if I have 10 webgrids? What should I do with the jquery?

- Mike

@Jacob,

You can use jQuery to target specific WebGrids by placing them in their own divs, with their own id for instance.

- CodeGolem

Hi! Nice article!
Thank you for sharing.

But what if I don't want to display the ID field on the grid?

:)

- Ola

GREAT example!

The only problem for me is that after changing the grid page it stops working - the grid is not clickable any more.

- Mindaugas

Hi, your tutorials and examples are excellent. I tried to combine the jquery example from searchable webgrid with the jquery from this example but it didn't work. Both have there own <script> section but only the second one seems to be in effect. Can you point me in the right direction? Should I combine the jquery into one?

Thanks again.

@section script{

<script type="text/javascript">
$(function(){
$('th a, tfoot a').live('click', function() {
$('form').attr('action', $(this).attr('href')).submit();
return false;
});
});
</script>
}

- Britto

Works Perfectly... Thx

- Raymond

@CodeGolem: on the ID field, add the following > .Hidden(true)
This prevents the ID from showing, but yet, you can use it since
its still there ;) (ie. if you need to redirect to a detail page or alike..)

Recent Comments

Justin Kusuma 7/24/2015 3:38 AM
In response to Posting Data With jQuery AJAX In ASP.NET Razor Web Pages
Hi Mike, thanks much for sharing such an article :) Really help me a lot... further, I'd like to...

Michael Easterbrook 7/22/2015 5:35 PM
In response to Inline Razor Syntax Overview
I removed the @ symbols and I am still getting the same error. It only occurs when I have an "if" a...

Sujay 7/22/2015 1:36 PM
In response to ASP.NET MVC, Entity Framework, One-to-Many and Many-to-Many INSERTS
can you explain how to link two tables so that it forms many to many relationship?(Article and...

Max G 7/21/2015 9:29 PM
In response to Scheduled Tasks In ASP.NET With Quartz.Net
Hi, I've opted for this solution in one of my applications but i've found that the apppool is and I...

Michael Easterbrook 7/20/2015 4:31 PM
In response to Inline Razor Syntax Overview
When I have the following code: @foreach (var procRow in procRowDecade) { if (@procRow[3] +...

Shanice 7/18/2015 10:58 PM
In response to A Better Way To Export Gridviews To Excel
Hi. I'm working with mvc. I need to add the above code in the business logic layer, however the...

Matt 7/18/2015 6:29 PM
In response to Nested Layout Pages with Razor
Cheers sir, nice explanation :)...

Keshavan 7/17/2015 9:06 AM
In response to Scheduled Tasks In ASP.NET With Quartz.Net
Hi Mike, I have followed exactly as illustrated in blog, I get error "StdSchedulerFactory.cs" not...

Paul Thiel 7/16/2015 5:17 PM
In response to ASP.NET 5 By Numbers
Comments Below: "The new version of ASP.NET is called ASP.NET 5. It is a framework for developing...

saket singh 7/16/2015 8:42 AM
In response to Scheduled Tasks In ASP.NET With Quartz.Net
hi Mike, great tutorial on Quartz.net , but i have One Problem , Everything is working fine as as...