【问题标题】:Can the display name (label) for one property change depending on the value of another?一个属性的显示名称(标签)是否会根据另一个属性的值而改变?
【发布时间】:2019-10-18 22:29:56
【问题描述】:

我有这个视图模型:

public class ProjectViewModel
{
    [Display(Name = "End date")]
    public DateTime ProjectEnd { get; set; }
    public string ProjectType { get; set; }
    // more properties
}

我希望根据ProjectType 的值更改ProjectEnd 的显示名称。 ProjectType 不是用户可编辑的字段,它只能在控制器中以编程方式设置。

我试过这个:

[Display(Name = (ProjectType == "project"?"End date":"Due date"))]

...但是ProjectType 抛出这个编译时错误:

非静态字段、方法或属性“ProjectViewModel.ProjectType”需要对象引用

我正在尝试的可能吗?我当然可以在视图中对标签进行硬编码,但我不想这样做。

另一个稍微好一点的解决方案可能是有两个DateTime-properties,并根据ProjectType 的值,只在视图中显示一个或另一个。

【问题讨论】:

  • 如果您将字段数据和标签之间的关系定义为模型数据的一部分(以避免在前端对此进行编码),那么您可以将其显示在页面上的隐藏字段中。然后,您可以在输入数据字段上设置一个 JavaScript 事件,以检查更改并参考隐藏字段以查看标签应该是什么。
  • @Michael ProjectType 在创建实体模型后不会更改。它在创建时在控制器中设置。
  • 酷,我喜欢@Nkosi 将标签定义为字符串的解决方案的外观

标签: c# asp.net-core-mvc data-annotations


【解决方案1】:

我正在尝试的可能吗?

没有。

可能的解决方法

public class ProjectViewModel {    
    public string ProjectEndLabel => ProjectType == "project" ? "End date" : "Due date";
    public DateTime ProjectEnd { get; set; }
    public string ProjectType { get; set; }
    // more properties
}

然后在视图中使用标签 HTML 助手绑定到 Model.ProjectEndLabel

@model ProjectViewModel

<!-- ... -->

<label for="ProjectEnd">@Model.ProjectEndLabel</label>
<input asp-for="ProjectEnd" /> <br />

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多