You can use a view model that will contain a property indicating the line number.
Suppose you have the following domain model:
public class DomainModel { public string Foo { get; set; } }
Now you are creating a view model that will meet the requirements of your view:
public class MyViewModel { public int RowNumber { get; set; } public string Foo { get; set; } }
and then:
public ActionResult Index() { // fetch the domain model from somewhere var domain = Enumerable.Range(1, 5).Select(x => new DomainModel { Foo = "foo " + x }); // now build the view model // TODO: use AutoMapper to perform this mapping var model = domain.Select((element, index) => new MyViewModel { RowNumber = index + 1, Foo = element.Foo }); return View(model); }
Now your view will be strongly typed on the view model:
@model IEnumerable<MyViewModel> @{ var grid = new WebGrid(Model); } @grid.GetHtml( columns: grid.Columns( grid.Column("RowNumber"), grid.Column("Foo") ) )
Now suppose that for some stupid reason you do not want to use presentation models. In this case, you can put your view in spaghetti code if you want:
@model IEnumerable<DomainModel> @{ var grid = new WebGrid(Model.Select((element, index) => new { element, index })); } @grid.GetHtml( columns: grid.Columns( grid.Column("RowNumber", format: item => item.index + 1), grid.Column("Foo", format: item => item.element.Foo) ) )
source share