使用 Fluent API 时如何控制 DisplayNameFor 结果

How to control DisplayNameFor result, when using FluentAPI

正在开发 ASP.NET MVC 5 应用程序。使用 Fluent API 定义模型图。我想更改列名称的外观,以便在执行 DisplayFor 时它能正确显示。例如,"Action Name",而不是 "ActionName"。

目前,我的流利 api 映射是....

this.Property(t => t.ActionName).HasColumnName("ActionName");

我想在 Action 和 Name 之间放置一个 space,这样当列出现时 table 列 header 会显示 "Action Name",而不是 "ActionName".所以,我认为这会起作用....

this.Property(t => t.ActionName).HasColumnName("Action Name");

但是,这会导致错误...

{"Invalid column name 'Audit Name'."}

在我的 HTML 中它设置为...

@Html.DisplayNameFor(model => model.ActionName)

我原以为 DisplayNameFor 会使用 .HasColumnName 设置,但显然不会。

我可以直接输入 HTML,但我正在尝试这样做 "correctly" 并了解其工作原理。

关于如何正确执行此操作的任何建议,以便 DisplayNameFor 结果 "Action Name"?

谢谢!

I could just type in the HTML directly, but I'm trying to do it "correctly" and understand how this works.

做事 "correctly" 意味着不使用实体 classes 作为 ViewModels - 它们有不同的用途。

为什么将实体用作 ViewModel 是个坏主意的一个很好的例子是用户帐户管理页面,例如,因为您需要 "New Password" 和 [=] 的两个 string 密码输入31=],但是您的实体 class 将只有一个 byte[] 用于密码 hash/digest(还有一个 salt 值,我希望) - 所以通过这个例子,我希望你明白为什么你不应该使用 User 实体作为 Web 应用程序中 UserEdit 页面的 ViewModel。

我不知道你的应用程序是做什么的,你也没有发布数据库设计,只是为你的 ViewModel 创建了一个不同的类型:

class SomePageViewModel {

    [DisplayName("Action name")]
    public String ActionName { get; set; }
}

当您 return 视图时,只需将实体对象的值复制到视图模型中即可:

public ActionResult ControllerAction() {

    // ...

    SomePageViewModel viewModel = new SomePageViewModel();
    viewModel.ActionName = entityObject.ActionName;

    return this.View( viewModel );
}