views:

351

answers:

4

Does anyone know how to sort the MVCContrib grid when using a complex object.

My grid is displaying a list of Person and I'm trying to sort on the Country property. The problem is that Country is a property an Address class which is a property of Person.

Person.Address.Country

    <%Html.Grid(Model).Columns(column =>
   {
       column.For(x => x.Id);
       column.For(x => x.FirstName);
       column.For(x => x.LastName).Sortable(false);
       column.For(x => x.Address.Country).Sortable(false);
       column.For(x => x.Age).Sortable(true);
   }).Render(); %>

Exception:
Property 'Country' is not defined for type '{Namespace}.Person'
var sourceProp = Expression.Property(sourceParam, this.SortBy); \MVCContrib\UI\Grid\Sortable\ComparableSortList.cs Line: 41

Any suggestions would be helpful.

Thank you,

MG1

+1  A: 

A workaround would be to expose Country as a property on Person and use that:

public string Country { get { return Address.Country; } }
orip
A: 

@orip gave you an answer.

But if you want to use the sorting feature you need to use:

<%Html.Grid(Model).Columns(column =>
{
   column.For(x => x.Id);
   column.For(x => x.FirstName);
   column.For(x => x.LastName).Sortable(false);
   column.For(x => x.Address.Country).Sortable(false);
   column.For(x => x.Age).Sortable(true);
}).RenderUsing(new SortableHtmlTableGridRenderer<Person>())
 .Render(); %>

Source: http://www.jeremyskinner.co.uk/2009/02/23/rewriting-the-mvccontrib-grid-part-3-gridmodels-and-gridrenderers/

Mendy
A: 

You need to use SortColumnName for this.

column.For(x => x.Address.Country).SortColumnName("Address.Country");

I have tested this and it works like a charm :)

If you are not able to access SortColumnName(), you can get the latest version of MVC contrib from http://mvccontrib.codeplex.com/SourceControl/changeset/changes/7db1cecc938f

Rashmi Pandit
A: 

@Rashmi

What is this SortColumnName that you speak of? I downloaded the code you reference and did a solution wide search for 'SortColumnName' and nothing came up.

Ren
Nevermind. I figured it out.
Ren