我正在探索夏普建筑,我想知道如何 调用Entity.IsValid()后访问验证结果。 我有两种情况,例如。
1)如果entity.IsValid()返回false,我想添加 我的控制器中的ModelState.AddModelError()集合出错。
E.g。在Northwind示例中,我们有一个EmployeesController.Create() 当我们做employee.IsValid(),我怎样才能访问 错误
public ActionResult Create(Employee employee) {
if (ViewData.ModelState.IsValid && employee.IsValid()) {
employeeRepository.SaveOrUpdate(employee);
}
// ....
}
[我已经知道调用Action方法时,modelbinder 强制执行验证规则(nhibernate验证器属性) 解析传入的值并尝试将它们分配给模型对象 如果它无法解析传入的值,则将其注册为 每个模型对象属性的modelstate中的错误。但是,如果我 有一些自定义验证。这就是为什么我们做ModelState.IsValid 第一。]
2)在我的测试方法中,我想测试nhibernate验证 规则也是如此。我可以做entity.IsValid()但只返回true / 假。我想断言实际错误不仅仅是真/ 假的。
在我以前的项目中,我通常使用包装器服务层 存储库,而不是直接从中调用Repositories方法 控制器,控制器调用服务层方法,然后调用 存储库方法。在我的服务层中所有自定义验证规则 驻留和服务层方法使用a抛出自定义异常 NameValueCollection我可以很容易地添加到ModelState中的错误 我的控制器。这样我也可以轻松实现复杂 我的服务层中的业务规则也是如此。我知道尖锐的建筑 还提供了一个服务层项目。但我感兴趣的是什么 我的下一个问题是:
如何使用NHibernate Vaidators来实现复杂的自定义 业务规则(不仅仅是null,空,范围等)和make Entity.IsValid()也验证这些规则?
答案 0 :(得分:0)
“我如何使用NHibernate Vaidators来实现复杂的自定义业务规则(不仅仅是null,空,范围等),并使Entity.IsValid()也验证这些规则?”
您必须创建自定义验证属性:
这是一个例子:
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public sealed class LoginUniqueAttribute : ValidationAttribute
{
private static readonly string DefaultErrorMessage = MUI.LoginNameInUse;
public LoginUniqueAttribute()
: base(DefaultErrorMessage)
{
}
public override string FormatErrorMessage(string name)
{
return DefaultErrorMessage;
}
public override bool IsValid(object value)
{
if (string.IsNullOrEmpty((string)value))
{
return true;
}
var userService = IoC.Resolve<IUserService<User>>();
return userService.GetByLogins(new[] { (string)value }).Count() == 0;
}
}
并使用UserInput dto
[Required]
[LoginUniqueAttribute]
[RegularExpression("^[A-Za-z0-9.'\\s]+$", ErrorMessage = "Only characters and digits are allowed")]
[DisplayNameLocalized(typeof(MUI), "LoginName")]
public string LoginName { get; set; }
也不要忘记在Application_Start上的global.asax.cs文件中初始化验证:
private void InitializeValidator()
{
var provider = new NHibernateSharedEngineProvider();
NHibernate.Validator.Cfg.Environment.SharedEngineProvider = provider;
}