EF 5数据库首先使用自定义验证

时间:2012-10-09 19:42:05

标签: c# asp.net-mvc visual-studio-2010 entity-framework

为了体验Entity Framework的新功能,我创建了一个新的MVC 4 Internet应用程序。
我将它连接到现有数据库并使用dbContext生成器生成Model类。

通过运行应用程序,我在编辑表单时遇到了一些验证错误。作为DateTime字段的示例,如果日期插入为“12/10/2012”而不是2012-10-12(如在SQ服务器表示法中),则系统会抱怨。我试图在项目中找到验证码,但我在生成的代码中找不到它。

我的一个模型类如下:

public partial class Artist
{
    public Artist()
    {
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public Nullable<System.DateTime> DateOfBirth { get; set; }

    public virtual Countries Countries { get; set; }
}

如果使用数据库第一种方法,如何自定义验证错误?
如果我用我的验证属性装饰模型,那么一旦再次生成模型类,它们就会被删除。

此外,在一个“现实世界”项目中,必须使用现有数据库,那么开发模型类的最佳方法是什么?
通过添加具有相同名称的部分类来扩展自动生成的类?

编辑(引入视图的一部分):

@using (Html.BeginForm()) {
@Html.ValidationSummary(false)

<fieldset>
    <legend>Movie</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.Name)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Name)
        @Html.ValidationMessageFor(model => model.Name)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.DateOfBirth)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.DateOfBirth)
        @Html.ValidationMessageFor(model => model.DateOfBirth)
    </div>

    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>
}

2 个答案:

答案 0 :(得分:6)

好吧,你总是可以使用元数据类

public partial class ArtistMetaData
{
   [Required]
   [StringLength(20)]
   public string Name;//it can be a field instead of a property, must just have the same name and type than in your Model class
}

和部分类

[MetadataType(typeof(ArtistMetaData)]
public partial class Artist {
}

或者(我的首选解决方案)您可以使用外部验证库,例如优秀的FluentValidation

默认情况下你有一个“基本”验证(可以在global.asax中删除),检查:非空的值......不是空的(比如默认的必需属性),并且值是正确的类型。

答案 1 :(得分:1)

检查浏览器和机器文化设置,然后检查jquery验证文化。

我倾向于遇到这个问题,因为我有西班牙语配置,但mvc附带英文日期和货币格式等。例如dd / mm / yyyy vs mm / dd / yyyy

您还可以使用正则表达式属性来根据需要验证字段。