关于对被验证实体采取的行动的模型验证
本文关键字:验证 模型 实体 | 更新日期: 2023-09-27 18:22:23
我们如何根据对特定实体采取的操作验证数据?数据注释模型验证还有哪些更高级的替代方案?可能可插入Asp.netMVC和WebAPI,因此验证仍在自动进行。
示例
假设一个用户加入了web应用程序的表单。
public class User
{
// required when providing user as input
// not provided when creating new instance
public int Id { get; set; }
// required when user joins and of specific format AND IS UNIQUE based on data store users
// optional when providing user as input
public string Email { get; set; }
...
}
也许对象继承会有所帮助,但就我所想,继承只是一种破解。基类几乎没有任何属性,我们最终可能会得到几个极其相似的(属性)类,但只是为了使用数据注释而使用不同的注释。这不好。
所需实施
我在考虑基于对特定实体采取的行动进行验证。因此,我们可以定义如下内容:
public class User
{
[Required(Action = ValidationAction.Provide)] // or whatever action we'd define
public int Id { get; set; }
[Required(Action = ValidationAction.Create)]
[IsUnique(Action = ValidationAction.Create)] // custom DataAnnotations validator
[EmailAddress]
public string Email { get; set; }
...
}
Asp.net MVC和WebAPI控制器操作将需要某种属性来提供对特定实体(参数)所做操作的信息
[HttpPost]
[ValidateForAction("user", ValidationAction.Create)]
[ValidateForAction("user.InvitedBy", ValidationAction.Provide)]
public ActionResult Join(User user)
{
...
}
或为所有参数(及其子树中的对象实体)统一设置
[HttpPost]
[ValidateForAction(ValidationAction.Create)]
public ActionResult Join(User user)
{
...
}
当控制器上不存在ValidateForActionAttribute
时,操作验证应该只检查验证操作独立的注释(就像上面在我的实体示例中设置的EmailAddressAttribute
)。
类似的例子可能是添加答案的Stackoverflow场景,其中发布的答案详细信息将通过创建操作进行验证,相关的问题实体(答案中的属性)将根据provide操作进行验证。因为我们主要只需要它的Id
。
有这样的验证库吗?有人做过类似的事吗
你将如何进行这样的验证
这听起来类似于requiredef验证器,其中验证依赖于另一个属性。然而,模型验证在这里不起作用,因为模型"应该"独立于视图或控制器。
尽管假设您有一个与控制器上的各个操作相关联的视图模型,但该视图模型可以使用与视图要求一致的数据注释。有关MVVM模式的更多详细信息,请参阅ASP.Net MVC和MVVM。
关于Id的最后一条注释。不确定Required属性是否有效,因为int的默认值是有效值。也许是正则表达式?([1-9]|[0-9]{2,10})
public class RegistrationController
[HttpPost]
public ActionResult Provide(UserProvideViewModel user)
{
...
}
[HttpPost]
public ActionResult Join(UserJoinViewModel user)
{
...
}
}
[MetadataType(typeof(UserProvideViewModel_Validation))]
public partial class UserProvideViewModel : User
{
// properties unique to the view model
}
public class UserProvideViewModel_Validation
{
[RegularExpression(@"^([1-9]|'d{2,10})$")]
public Id { get; set; }
}
[MetadataType(typeof(UserJoinViewModel_Validation))]
public partial class UserJoinViewModel : User
{
// properties unique to the view model
}
public class UserJoinViewModel_Validation
{
[Required]
[EmailAddress]
public Email { get; set; }
}