ASP.NET MVC和ADO.NET實體框架中的最佳實踐實體驗證

.net asp.net-mvc entity-framework validation

我在一個項目中使用ASP.NET MVC和ADO.NET Entity Framework。我想通過部分類向我的實體添加驗證邏輯。它的工作方式類似於使用LINQ2SQL的NerdDinner.com ASP.NET MVC應用程序 。主要區別在於,我必須使用“OnPropertyChanging”事件而不是LINQ2SQL中的“OnValidating”。

這樣做有一些問題: - “OnPropertyChanging”事件不是調用驗證邏輯的最佳點,因為它總是觸發,即使在創建調用默認構造函數時也是如此。這確實會導致嚴重的問題(不僅僅是性能問題)。 - 與MVC框架一起使用“EntityState.Detached”(我找不到任何其他方法)來確定是否需要驗證實體時會出現問題。因為實體在視圖中顯示時會丟失其實體狀態(因為在POST事件中創建新的實體對象而不是返回原始實體對象)。

我的問題是:有沒有更好的方法向ADO.NET實體添加驗證?我找不到任何使用向ADO.NET實體添加驗證的實用方法的教程。

熱門答案

就個人而言,我沒有在對象本身中進行驗證。我使用xVal庫來處理我的實體驗證。

xVal鼓勵您使用描述各種驗證規則的屬性來註釋您的實體類(或實際上是元數據伴隨類)。這些驗證屬性是System.ComponentModel.DataAnnotations中.NET附帶的默認屬性。

然後,您可以在業務層中手動對對象運行驗證。這是通過使用運行System.ComponentModel.DataAnnotations驗證邏輯的方法來完成的。我寫了一個看起來像這樣的:

/// <summary>
/// Gets the validation errors for the passed in object by using reflection to retrieve the 
/// <see cref="ValidationAttribute"/>s placed on its properties or on the properties of the object's
/// metadata class (as specified by a <see cref="MetadataTypeAttribute"/> placed on the object's class)
/// </summary>
/// <param name="instance">The object to validate</param>
/// <returns>Any validation errors</returns>
/// <remarks>
/// Borrowed (and cleaned up) from
/// http://goneale.com/2009/03/04/using-metadatatype-attribute-with-aspnet-mvc-xval-validation-framework/
/// </remarks>
public static IEnumerable<ErrorInfo> Validate(object instance)
{
    //Try to get the MetadataType attribute from the object
    MetadataTypeAttribute metadataAttrib = instance.GetType().GetCustomAttributes(typeof(MetadataTypeAttribute), true).OfType<MetadataTypeAttribute>().FirstOrDefault();

    //If the MetadataType attribute existed, get the metadata class
    //else just use the class of the object
    Type buddyClassOrModelClass = metadataAttrib != null ? metadataAttrib.MetadataClassType : instance.GetType();

    IEnumerable<PropertyDescriptor> buddyClassProperties = TypeDescriptor.GetProperties(buddyClassOrModelClass).Cast<PropertyDescriptor>();
    IEnumerable<PropertyDescriptor> modelClassProperties = TypeDescriptor.GetProperties(instance.GetType()).Cast<PropertyDescriptor>();

    //This query matches each property on the model class against the buddy class
    //gets a list of all invalid validation attributes and returns a list of
    //validation errors
    return from buddyProp in buddyClassProperties
           join modelProp in modelClassProperties on buddyProp.Name equals modelProp.Name
           from attribute in buddyProp.Attributes.OfType<ValidationAttribute>()
           where !attribute.IsValid(modelProp.GetValue(instance))
           select new ErrorInfo(buddyProp.Name, attribute.FormatErrorMessage(String.Empty), instance);
}

xVal提供了一個可以拋出的簡潔異常類型,它封裝了驗證錯誤,並允許您輕鬆地將它們添加到Controller中的ModelState中。

xVal還將通過提供HtmlHelper方法利用jQuery.Validate為您自動生成客戶端JavaScript表單驗證代碼。

查看http://blog.codeville.net/2009/01/10/xval-a-validation-framework-for-aspnet-mvc/ ,了解其工作原理。我發現這是一種非常好的驗證方式,這不是一項繁瑣的工作。它適合ASP.NET MVC的工作方式。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因