Filtering column with a custom filter
Name Surname Marital status Age Birthday Employed
Joe Crosswave Married 31 1/5/1988 False
Merry Lisel Widowed 41 5/6/1978
Henry Crux Single 28 11/19/1990 True
Cody Jurut 49 8/11/1970 False
Simon Scranton Single 34 10/10/1985
Leena Laurent Divorced 19 7/1/2000 False
Ode Cosmides Married 53 4/17/1966 True
Diandra Mizner Single 20 8/20/1999 False
Pete Cassel Married 22 3/13/1997 False
Nicky Tremblay Married 31 1/5/1988 True
View

@model IEnumerable<Person>

@(Html
    .Grid(Model)
    .Build(columns =>
    {
        columns.Add(model => model.Name).Titled("Name").Filterable(true).FilteredAs("custom");
        columns.Add(model => model.Surname).Titled("Surname").Filterable(GridFilterType.Double).FilteredAs("custom");
        columns.Add(model => model.MaritalStatus).Titled("Marital status");

        columns.Add(model => model.Age).Titled("Age");
        columns.Add(model => model.Birthday).Titled("Birthday").Formatted("{0:d}");
        columns.Add(model => model.IsWorking).Titled("Employed");
    })
)

Javascript

var CustomTextFilter = (function (base) {
    MvcGridExtends(CustomTextFilter, base);

    function CustomTextFilter(column) {
        base.call(this, column);

        this.methods = ['contains'];
        column.grid.lang.custom = { contains: 'Contains' };
    }

    // Other extension points can be found at MvcGridFilter declaration

    return CustomTextFilter;
})(MvcGridFilter);

new MvcGrid(document.querySelector('.mvc-grid'), {
    filters: {
        'custom': CustomTextFilter
    }
});