Razor助手为List

时间:2017-03-23 12:01:35

标签: asp.net-mvc razor

我有大量的数字数据要从复杂对象列表的表格中吐出来。 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,但不能完全了解它。

更新问题以使其更有意义。

1 个答案:

答案 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());
}

你可以把它变得更通用,但这应该足以让它继续:)