加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 在MVC 4中获取表头名称的最佳方法

发布时间:2020-12-16 07:01:22 所属栏目:asp.Net 来源:网络整理
导读:我正在尝试在表格中显示对象列表.我可以迭代每个单独的项目以找到它的值(使用for循环或 DisplayTemplate),但是我如何非常地选择一个来显示整个组的标题. 这是一个简化的例子: 模型: public class ClientViewModel{ public int Id { get; set; } public Lis
我正在尝试在表格中显示对象列表.我可以迭代每个单独的项目以找到它的值(使用for循环或 DisplayTemplate),但是我如何非常地选择一个来显示整个组的标题.

这是一个简化的例子:

模型:

public class ClientViewModel
{
    public int Id { get; set; }
    public List<ClientDetail> Details { get; set; }
}
public class ClientDetail
{
    [Display(Name="Client Number")]
    public int ClientNumber { get; set; }
    [Display(Name = "Client Forname")]
    public string Forname { get; set; }
    [Display(Name = "Client Surname")]
    public string Surname { get; set; }
}

视图

@model MyApp.ViewModel.ClientViewModel

@{ var dummyDetail = Model.Details.FirstOrDefault(); }

<table>
    <thead>
        <tr>
            <th>@Html.DisplayNameFor(model => dummyDetail.ClientNumber)</th>
            <th>@Html.DisplayNameFor(model => dummyDetail.Forname)</th>
            <th>@Html.DisplayNameFor(model => dummyDetail.Surname)</th>
        </tr>
    </thead>
    <tbody>
        @for (int i = 0; i < Model.Details.Count; i++)
        {
              <tr>
                <td>@Html.DisplayFor(model => model.Details[i].ClientNumber)</td>
                <td>@Html.DisplayFor(model => model.Details[i].Forname)</td>
                <td>@Html.DisplayFor(model => model.Details[i].Surname)</td>
            </tr>
        }
    </tbody>
</table>

注意:我正在使用var dummyDetail = Model.Details.FirstOrDefault();获取我可以在DisplayNameFor中访问其属性的单个项目.

>访问这些标题的最佳方法是什么?
>如果集合为空,这会破坏吗?
>我应该用硬编码的纯文本标签替换它们吗?

解决方法

问题

由于Thomas pointed out,Chris’s answer在某些情况下有效,但在使用ViewModel时会遇到麻烦,因为嵌套属性不具有相同的自动分辨率.如果您的模型类型是IEnumerable< Type>,则此方法有效,因为DisplayNameFor lambda仍然可以访问模型本身的属性:

但是,如果ClientDetail集合嵌套在ViewModel中,我们无法从集合本身获取项属性:

Collection inside ViewModel

解决方案

正如DisplayNameFor() From List in Model所指出的,您的解决方案实际上非常好.如果集合为null,这不会导致任何问题,因为传递给DisplayNameFor的lambda永远不会被实际执行.它仅将其用作表达式树来标识对象的类型.

所以以下任何一个都可以正常工作:

@Html.DisplayNameFor(model => model.Details[0].ClientNumber)

@Html.DisplayNameFor(dummy => Model.Details.FirstOrDefault().ClientNumber)

@{ ClientDetail dummyModel = null; }
@Html.DisplayNameFor(dummyParam => dummyModel.ClientNumber)

进一步说明

如果我们想看到传递表达式所涉及的一些花哨的步法,只需查看DisplayNameFor上的源代码或DescriptionFor之类的自定义实现.这是一个简化示例,说明当我们使用以下不可能的表达式调用DisplayNameFor时会发生什么:

@Html.DisplayNameFor3(model => model.Details[-5].ClientNumber)

请注意我们如何从lambda表达式中的model.Details.get_Item(-5).ClientNumber转到只能识别成员(ClientNumber)而不执行表达式.从那里,我们只使用反射来查找DisplayAttribute并获取其属性,在本例中为Name.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读