锐利的架构;访问验证结果

时间:2010-05-13 11:07:40

标签: asp.net-mvc nhibernate

我正在探索夏普建筑,我想知道如何 调用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()也验证这些规则?

1 个答案:

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