【问题标题】:How to @Html.DisplayNameFor() on a property of a list’s base class property?如何@Html.DisplayNameFor() 对列表的基类属性的属性?
【发布时间】:2016-02-24 16:06:28
【问题描述】:
public class BaseModel 
{
    public Guid ID;
    public string Name;
    public List<BaseModelChildModel> BaseModelChildModels;
}

public class BaseModelChildModel
{
    public double Value;
    public string Notes;
    public BaseModel BaseModel;
    public ChildModel ChildModel;
}

public class ChildModel
{
    public Guid ID;
    public string Name;
    public int Productivity;
    public bool IsActive;
 }

在cshtml中,在哪里

@model BaseModel
<thead>
    <tr>
        <th>@Html.DisplayNameFor()</th>
    </tr>
</thead>

鉴于BaseModel.BaseModelChildModels 大约一半时间包含0 个元素,如何使@Html.DisplayNameFor() 显示ChildModel.NameChildModel.IsActive 的正确名称? (通过local.resx 获得的正确显示名称,如果有区别的话)

【问题讨论】:

    标签: c# .net asp.net-mvc razor view


    【解决方案1】:

    如果您可以将属性更改为IEnumerable&lt;BaseModelChildModel&gt;,那么您应该可以这样做:

    @Html.DisplayNameFor(m => m.BaseModelChildModels.Foo)
    

    否则,您可以索引该属性。这里的表达式并不是每个实际访问的,它只是被评估以获得显示名称。因此,如果列表中没有项目,索引属性将不会导致错误,因为它是传统的:

    @Html.DisplayNameFor(m => m.BaseModelChildModels[0].Foo)
    

    【讨论】:

    • 所以,换句话说,将NameChildModel 带入BaseModelChildModel?整个事情需要工作的方式是从 BaseModel、BaseModelChildModel 和 ChildModel 访问属性需要同时在 UI 中可用,然后在另一个视图中,它们实际上是倒置的,因此 BaseModelChildModel 实际上是一个在包含附加数据的关系数据库中进行透视。根据您的回复,我认为最好的方法是为视图生成一个新模型,这意味着 T4 模板上的负载更多。
    • 没有。你不需要移动任何东西。 DisplayNameFor 的工作方式是评估表达式以找到它检索显示名称的属性,然后显示该属性。你只需要为它提供一个可以让你到达那里的表达式。唯一的问题是获取BaseModelChildModel 的单个实例,因为集合本身没有您需要使用的属性,即ChildModel.Name。使用IEnumerable,您可以直接从集合中引用该属性,但对于其他任何事情,您都需要单个实例的表达式。
    • 换句话说,如果您的目标是获取ChildModel.Name 的显示名称,并且您正在处理List&lt;BaseModelChildModel&gt;,您只需要像BaseModelChildModels[0].ChildModel.Name 这样的表达式。
    • 谢谢,克里斯。我完全可以使用 IEnumerable,没问题。
    • 所以……当IEnumerable&lt;BaseModelChildModel&gt; BaseModelChildModels,我应该可以做(Model =&gt; Model.BaseModelChildModels.ChildModel.Name)? VS 只是抱怨IEnumerable&lt;BaseModelChildModel&gt; does not have a definition for 'ChildModel' and no extension method。可能遗漏了什么。
    猜你喜欢
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    相关资源
    最近更新 更多