使用FluentAPI时如何控制DisplayNameFor结果

时间:2017-03-08 01:12:36

标签: c# asp.net-mvc razor ef-fluent-api

使用ASP.NET MVC 5应用程序。使用Fluent API定义模型映射。我想更改列名称外观,以便如果我执行DisplayFor它会正确显示。例如,"操作名称",而不是" ActionName"。

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

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

我想在Action和Name之间放置一个空格,以便当列显示时,表列标题将显示" Action Name",not" ActionName"。所以,我认为这会起作用....

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

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

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

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

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

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

我可以直接输入HTML,但我正在努力做到这一点"正确"并了解这是如何工作的。

有关如何正确执行此操作的任何建议,以便DisplayNameFor导致"操作名称"?

谢谢!

1 个答案:

答案 0 :(得分:1)

  

我可以直接输入HTML,但我正在努力做到这一点"正确"并了解其工作原理。

正确地做事#34;"意味着不使用实体类作为ViewModels - 它们用于不同的目的。

为什么将实体用作ViewModels是个坏主意的一个很好的例子是用户帐户管理页面,例如,因为你需要两个string密码输入用于"新密码&# 34;和#34;确认密码",但您的实体类只有一个byte[]用于密码哈希/摘要(以及salt值,我希望) - 所以通过这个例子,我希望你明白为什么你不应该将User实体用作你网页应用程序中UserEdit页面的ViewModel。

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

class SomePageViewModel {

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

当您返回视图时,只需将实体对象中的值复制到viewmodel中:

public ActionResult ControllerAction() {

    // ...

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

    return this.View( viewModel );
}