You can write an HTML helper that examined the lambda property, executed sum (), and used your data annotations.
View Model
public class FooViewModel
{
[Required]
[Display( Name = "My Display Name" )]
public int Bar {
get;
set;
}
public string Baz {
get;
set;
}
}
View
@model IEnumerable<FooViewModel>
@* Razor engine prefers this syntax? think generic may confuse it *@
@(Html.SumFor<FooViewModel>( o => o.Bar ))
Helper extension
. , .
public static IHtmlString SumFor<TEnumerableItem>( this HtmlHelper helper,
Expression<Func<TEnumerableItem, int>> expression ) {
var propertyName = ( (MemberExpression)expression.Body ).Member.Name;
var metadata = ModelMetadataProviders.Current
.GetMetadataForProperty( null, typeof( TEnumerableItem ), propertyName );
var ienum = (IEnumerable<TEnumerableItem>)helper.ViewData.Model;
var f = expression.Compile();
var sum = ienum.Sum( f );
return MvcHtmlString.Create(
string.Format( "<div>Sum of {0} is {1}.</div>", metadata.DisplayName, sum )
);
}