【问题标题】:View - dynamic model视图 - 动态模型
【发布时间】:2020-01-26 04:43:46
【问题描述】:

我正在尝试在我的视图中创建一个动态表,该表将根据我发送到视图的模型类型动态生成。所以,我基本上有两个动作:

public IActionResult People()
{
        List<Person> lst = new List<Person>();
        // Add data...
        return View("Table", lst);
}

public IActionResult Teams()
{
        List<Team> lst = new List<Team>();
        // Add data...
        return View("Table", lst);
}

现在我想要显示人员/团队列表的相同视图,这样我就不必复制它了。我的 Table.cshtml 看起来像这样:

@model List<dynamic>
<table>
    <tr>
        @foreach (var item in Model.ElementAt(0).GetType().GetProperties())
        {
            <td>
                @item.Name
            </td>
        }
    </tr>
    @foreach (var item in Model)
    {
        <tr>
            // foreach (var propValue in item.GetProperties())
            // Get value for each property in the `item`
        </tr>
    }
</table>

我的基本输出是一个 HTML 表格,如下所示:

Id, PersonName, Age
1, John, 24
2, Mike, 32
3, Rick, 27

我遇到的问题是动态获取模型类实例中每个属性的值。我不知道如何从项目中获取价值(没有 item.Property(someName).GetValue() 这样的东西)。这样我就可以发送一个列表(T 可以是人、团队、学生,任何东西),结果我会得到一个&lt;table&gt;,其中包含人/团队/学生属性(例如 ID、姓名、年龄)和每个人的值另一个&lt;tr&gt;中的属性。

【问题讨论】:

标签: c# asp.net-mvc asp.net-core model-view-controller view


【解决方案1】:
@model  List<dynamic>
<table>
    <tr>
        @foreach (var item in Model.ElementAt(0).GetType().GetProperties())
        {
            <td>
                @item.Name
            </td>
        }
    </tr>
    @foreach (var item in Model)
    {
        if (item.GetType() == typeof(Person))
        {
            var person = item as Person;

            <tr>
                @person.Name
            </tr>
        }
        if (item.GetType() == typeof(Team)) {

            var team = item as team;

                <tr>
                     @team.Name
               </tr>

        }

    }
</table>

【讨论】:

    【解决方案2】:

    当我使用@model List&lt;dynamic&gt; 作为视图模型时会出现错误。当我将其更改为@model dynamic 时,它适用于以下代码

    @model dynamic
    @using System.Reflection
    @{
        var properties = Model[0].GetType().GetProperties();
    }
    <table>
        <tr>
            @foreach (var item in properties)
            {
                <td>
                    @item.Name
                </td>
            }
        </tr>
        @foreach (var item in Model)
        {
            <tr>
                @foreach (PropertyInfo p in properties)
                {
                    <td>@p.GetValue(item)</td>
                }
            </tr>
        }
    
    </table>
    

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 2013-03-08
      • 2023-03-06
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多