2012-10-09 84 views
2

爲了體驗實體框架的新功能,我創建了一個新的MVC 4互聯網應用程序。
我將它連接到現有的數據庫並使用dbContext生成器生成Model類。EF 5數據庫首先使用自定義驗證

通過運行該應用程序,我在編輯表單時遇到了一些驗證錯誤。作爲DateTime字段的示例,如果日期插入爲「2012年12月10日」而不是2012-10-12(如SQ Server表示法中所示),系統就會抱怨。
我試圖在項目中找到驗證代碼,但在生成的代碼中找不到它。

我的一個模型類如下:

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; } 
} 

如果使用數據庫第一種方法我怎樣才能定製驗證錯誤?
如果我用我的驗證屬性裝飾模型,那麼一旦模型類再次生成,它們將被擦除。

此外,在一個「現實世界」項目中,現有數據庫的使用是強制性的,那麼在開發模型類時最好的方法是什麼?
通過添加具有相同名稱的部分類來擴展自動生成的類?

EDIT(介紹視圖的一部分):

@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> 
} 
+1

您的觀點是什麼樣子?在MM/DD/YYYY格式中輸入日期應該沒有問題,因爲在將它發送到SQL Server之前,它會在.net中轉換爲DateTime。因此,在你看來,你必須做一些有點過分的事情。除非您嘗試以DD/MM/YYYY格式輸入日期,在這種情況下,這是一個全球化問題,這是一個完全不同的問題。但是,您給出的示例不應該給出任何驗證錯誤,因爲它的使用方式都是有效的(儘管如果使用DD/MM/YYYY,顯然可能不會給出結果) –

+0

您可以使用Fluent API添加驗證約束:http: //msdn.microsoft.com/en-us/data/gg193959.aspx – millimoose

+0

@millimoose - 這些約束只適用於數據庫,而不適用於MVC驗證。 –

回答

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中刪除),檢查:非空值...不爲空(如默認的必需屬性),並且該值爲正確的類型。

+0

+1 - 我發現元數據類是一個優雅的解決方案。 在Global.asax中我找不到任何有關驗證的方法。這是我能看的唯一的地方嗎? – Francesco

+0

@Luca你有沒有在Global.asax中,但可以明確地由'DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes'屬性設置爲false(在'application_start'的「隱含的」商辦事情,例如,你會不會有默認消息「屬性xxx不應該爲空」或類似的東西,當試圖將null置於一個int屬性時) –

+0

我添加了它並將其值設置爲false,但仍顯示消息。它與日期格式有關,因爲通過以「SQL Server」格式(yyyy-mm-dd)輸入日期格式來通過驗證。 – Francesco

1

檢查您的瀏覽器和機器的文化設置,然後jQuery驗證文化。

我傾向於因爲我西班牙人配置有這個問題,但MVC自帶的英文日期和貨幣格式等。例如DD/MM/YYYY VS MM/DD/YYYY

你也可以根據需要使用正則表達式屬性來驗證該字段。