枚举ViewData.Model的所有属性

时间:2014-01-29 06:10:45

标签: c# asp.net-mvc viewdata

我正在尝试使用PartialView创建通用网格。在哪里我将推送任何模型,它将输出一些html和js,以便我可以重用。但为此,我需要dynamic类型IEnumerable,现在我需要从ViewData.Model获取传递模型的所有属性,因为这是我设置模型的地方。但我找不到具体的解决方案。
有人可以指出我正确的方向吗?那将是一个很大的帮助。

1 个答案:

答案 0 :(得分:4)

我没有看到需要PartialView我会为此创建一个HTML帮助器。你的html助手只接受一个简单的object作为模型。在帮助器中,您构造表(使用字符串),然后枚举对象模型的所有属性。

这可以通过创建一个html帮助器来轻松完成。

public static class HtmlHelpers
{
    public static IHtmlString ModelTableForm(this HtmlHelper html, object model)
    {
        StringBuilder modelTable = new StringBuilder();
        modelTable.Append("<table>");
        modelTable.AppendFormat("<caption>{0}</caption>", model.GetType().Name);
        modelTable.Append("<tbody>");

        foreach (var property in model.GetType().GetProperties())
            modelTable.Append(addModelRow(property.Name, property.GetValue(model, null)));
        modelTable.Append("</tbody>");
        modelTable.Append("</table>");
        return html.Raw(modelTable.ToString());
    }

    static string addModelRow(string name, object value)
    {
        StringBuilder row = new StringBuilder();
        row.Append("<tr>");
        row.AppendFormat("<td>{0}</td>", name);
        row.AppendFormat("<td>{0}</td>", value);
        row.Append("</tr>");
        return row.ToString();
    }
}

正如您所看到的,这个帮助器只是使用字符串构造表,并枚举所有属性,为每个属性创建一行。

接下来是访问HTML帮助器。现在这一切都取决于您创建类的位置,但可以使用语句

轻松添加到任何View

using <my full html helper namespace;

最后要调用Helper,你只需要简单地从@Html对象调用html帮助器。

@Html.ModelTableForm(Model)

这将生成一个表(所有人都需要更多的样式工作)。如 enter image description here

我的建议是添加一些样式,也许是属性类型检查,修改帮助程序如何显示不同的属性类型。 (如果属性继承IEnumerable以通过使用递归将所有条目和属性枚举到子表中,则为IE)。

反正。希望这有帮助