我有大量的数字数据要从复杂对象列表的表格中吐出来。 Dto对象中的每个属性都需要表中的一行,例如......
|dtos[0]|dtos[1]|dtos[2]|dtos[4]
prop1| w | x | y | z
prop2| a | b | c | d
理想情况下,我会给这样的帮手打电话......
@RenderTr("prop 1", model.Dtos, x => x.prop1);
@RenderTr("prop 2", model.Dtos, x => x.prop2);
...它会遍历Dtos列表并为每个指定的属性吐出一个td。导致以下html ...
<tr><td>prop 1</td><td>w</td><td>x</td><td>y</td><td>z</td></tr>
<tr><td>prop 2</td><td>a</td><td>b</td><td>c</td><td>d</td></tr>
我已经尝试过调查模板化的Razor代表,帮助他们玩弄乐趣和表达args,但不能完全了解它。
更新问题以使其更有意义。
答案 0 :(得分:2)
最佳方法是HTMLHelper上的自定义扩展方法 - 传入行标题,dtos列表和成员表达式,让方法知道您要追踪的属性。
public static MvcHtmlString TableRowForProperty(this HtmlHelper htmlHelper, string rowName, IEnumerable<Financial> modelList, Expression<Func<Financial, decimal>> propertySelector)
{
var sb = new StringBuilder();
sb = sb.Append("<tr>");
sb.Append($"<td>{rowName}</td>");
foreach (var model in modelList)
{
var memberExpression = (MemberExpression)propertySelector.Body;
var propertyInfo = (PropertyInfo)memberExpression.Member;
var value = propertyInfo.GetValue(model);
sb.Append($"<td>{value}</td>");
}
sb = sb.Append("</tr>");
return new MvcHtmlString(sb.ToString());
}
你可以把它变得更通用,但这应该足以让它继续:)