使用元数据类覆盖MVC视图模型中的EF字段名称不起作用

时间:2014-02-20 09:49:37

标签: c# asp.net-mvc entity-framework asp.net-mvc-5

我正在编写一个MVC5 / EF6网站,我正在尝试尽可能完整地保持数据模型和视图模型的分离。

所以我的EF类(存储在一个单独的程序集中)如下所示:

public class WorksOrder
{
    [Key]
    public int Id { get; set; }

    public string CreatedById { get; set; }
}

我的视图程序集中有一个元数据类(视图控制器所在的位置),我在其中覆盖显示名称并添加错误消息

public class WorksOrder
{
    [Display(Name = "Created by")]
    [Required(ErrorMessage = "created by cannot be blank")]
    public string CreatedById { get; set; }
}

我在视图模型中附加了两个类:

TypeDescriptor.AddProviderTransparent(
    new AssociatedMetadataTypeTypeDescriptionProvider(typeof(EF.Models.WorksOrder),
    typeof(ViewMetadata.WorksOrder)), typeof(EF.Models.WorksOrder));

当我显示表单时,字段标签是“CreatedById”而不是元数据类中指定的显示属性(“Created by”)。我知道AddProviderTransparent有效,因为如果我尝试提交一个CreatedById字段为空的表单,我会收到错误消息(“由不能为空”创建)。

编辑:这是Razor文件(我清除了不重要的东西(div等)。

@model App.Models.WorksOrderCreateModel

@using (Html.BeginForm())
{
    @Html.LabelFor(model => model.WorksOrder.CreatedById, new { @class = "control-label col-md-3" })
    @Html.TextBoxFor(model => model.WorksOrder.CreatedById, new { @class = "form-control col-md-3" })
    @Html.ValidationMessageFor(model => model.WorksOrder.CreatedById)

1 个答案:

答案 0 :(得分:4)

在MetaData类中创建类似于此的部分类。

[MetadataType(typeof(WorksOrderMetaData))]
public partial class WorksOrder
{
}

public class WorksOrderMetaData
{
    [Display(Name = "Created by")]
    [Required(ErrorMessage = "created by cannot be blank")]
    public string CreatedById { get; set; }
}

这将有效