Jul*_*n N 14 c# validation entity-framework asp.net-dynamic-data
当用户使用Entity Framework将其更改保存在动态数据屏幕中时,我正在寻找一种解决方案来执行一些自定义实体验证(需要数据库访问,跨成员验证......).
验证比我对属性的处理更复杂(它需要访问数据库等)
你能拦截SaveChanges电话吗?
我试图ValidateEntity在DbContext对象中覆盖,但动态数据似乎没有调用它(可能是因为它使用内部ObjectContext,不知道为什么),并且重写SaveChanges也没有帮助.
我没有看到任何可以订阅的事件......
该文档应该有所帮助:
通过重写OnValidate方法或处理Validate事件来自定义单个数据字段的验证,这些事件在更改任何数据字段时调用.此方法允许您为单个字段添加验证和业务逻辑.这种方法比为单个字段添加验证更通用.当相同的验证逻辑可以应用于多个数据字段时,它很有用.它还允许您执行涉及多个字段的验证检查.
但我正在使用POCO Entity Framework 6类,所以没有OnValidate方法可以覆盖,而且从我读到的内容是LinqToSql,我找不到Validate他们提到的事件.
我试图在我的DbContext的构造函数中订阅SavingChanges内部事件,ObjectContext手动调用ValidateEntity,但我不知道如何处理结果.如果我抛出DbEntityValidationException(或本文中ValidationException建议的那样),ASPNET会像任何异常一样处理它(黄色屏幕).
实施IValidatableObject也不起作用.
我也尝试实现我自己DynamicValidator看看会发生什么,但没有成功,它似乎处理异常(如果我覆盖ValidateException,并设置断点,我看到它)但它仍然冒泡到默认错误处理程序并显示黄色屏幕.我肯定错过了什么.
那么,在保存为动态数据/ EF之前,您应该如何对实体执行复杂的验证(交叉字段,查询等)?
我找到了一个我不喜欢的解决方法,但它有效:
我的上下文仍在执行验证,并ValidationException在必要时抛出 a。
由于ListView似乎没有捕获和处理异常,我自己通过处理 的OnItemUpdated或OnItemInserted事件来完成ListView:
protected void ListView1_ItemUpdated(object sender, ListViewUpdatedEventArgs e)
{
if (e.Exception != null)
{
ValidationError.DisplayError(e.Exception.Message);
e.ExceptionHandled = true;
e.KeepInEditMode = true;
}
}
Run Code Online (Sandbox Code Playgroud)
ValidationError用于将异常消息添加到验证摘要中。它添加了一个“假”的、总是失败的消息验证器。
public class ValidationError : BaseValidator
{
private ValidationError(string message)
: base()
{
ErrorMessage = message;
IsValid = false;
}
protected override bool EvaluateIsValid()
{
return false;
}
public static void DisplayError(string message, string validationGroup)
{
var currentPage = HttpContext.Current.Handler as Page;
currentPage.Validators.Add(new ValidationError(message) { ValidationGroup = validationGroup });
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
882 次 |
| 最近记录: |