【问题标题】:Why MetadataType doesn't do my validation in database first approach?为什么 MetadataType 不在数据库优先方法中进行验证?
【发布时间】:2012-10-06 04:26:10
【问题描述】:

我使用 Database-First 生成模型类(EDMX 文件),我想使用“MetadataType”进行验证。我在这里阅读了解决方案,但它们对我不起作用。

这是我的代码:

[MetadataType(typeof(MovieEntitiesMetaData))]
public partial class MovieEntities
{        
}

public class MovieEntitiesMetaData
{
    [DisplayFormat(DataFormatString = "{0:c}")]
    public Nullable<global::System.Decimal> PRICE { get; set; }
}

这里有什么遗漏吗,或者为什么我的解决方案不起作用?

【问题讨论】:

    标签: asp.net asp.net-mvc entity-framework database-first metadatatype


    【解决方案1】:

    创建一个名为MoviePartial.cs 的新文件并将以下代码放入其中:

    [MetadataType(typeof(MovieMetaData))]
    public partial class Movie
    {    
        internal sealed class MovieMetaData
        {
            [DisplayFormat(DataFormatString = "{0:F2}", ApplyFormatInEditMode = true)]
            [Required(ErrorMessage = "Price is required")]
            public decimal? PRICE { get; set; }
        }
    }
    

    您还需要将Movie 类型传递给视图,以便可以连接数据注释。如果您有自定义视图模型,则数据注释将不起作用。

    在创建/编辑视图中,您必须拥有:

    @Html.EditorFor(m => m.PRICE)
    

    在详细信息视图中,您必须拥有:

    @Html.DisplayFor(m => m.PRICE)
    

    要了解更多信息,请按照这个不错的分步教程进行操作:

    Validation with the Data Annotation Validators (C#)

    【讨论】:

    • 我改了代码还是不行,怎么把MovieEntities传给View?
    • 您的视图将使用的对象的名称是什么? MovieEntities 是您的数据上下文的名称还是来自数据库的表名?
    • MovieEntities 是在 web.config 中保存表名 Movie 的 Model/ConnectionString 的名称。但是我将课程更改为电影仍然没有用。这是我的 View @model IEnumerable 开头的模型
    • 我编辑了答案以反映您的实体名称 - 在本例中为 Movie。现在,在名为Create 的控制器操作中,只需将一个新的Movie 对象传递给视图并将@model MvcApplication3.Models.MOVIE 放在视图文件的顶部。您应该看到验证在起作用。顺便说一句:您没有为 Price 属性指定任何验证。我将添加[Required] 之一。看我的回答。如需完整教程,请参阅我提供给您的链接。
    • 除了验证,我想为货币添加显示格式,我认为它的工作原理是一样的。但是显示还是和以前一样。有没有遗漏的代码?
    猜你喜欢
    • 1970-01-01
    • 2020-12-14
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 2021-04-29
    • 2011-11-20
    • 1970-01-01
    相关资源
    最近更新 更多