如何解决如何根据条件要求填充实体属性 - ASP NET Core MVC 和实体框架
仅当 Item2
= "yes" 时,我才希望 Item.code
是强制性的。 InputModel
用于 Register
处的 Register.cshtml.cs
。
public class Item
{
[required]
public string Id{ get; set; }
[required]
public string desc{ get; set; }
[required]
public string code{ get; set; }
}
public class Item2
{
[required]
public string Id{ get; set; }
[required]
public string slug{ get; set; }
}
public class InputModel
{
[required]
public string Email { get; set; }
[required]
public string Password{ get; set; }
[required]
public Item Item { get; set; }
public Item2 Item2 { get; set; }
}
我打算做这样的事情,IN InputModel
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (Item.code=="yes")
{
===> set Item2 required
}
}
这就是逻辑,有人能帮忙吗?
解决方法
我建议您尝试使用评论中提到的 FluentValidation。花点时间研究它真的很值得。假设您已经下载了它并想要实现您的验证。
public class InputModel
{
public string Email { get; set; }
public string Password{ get; set; }
public Item Item { get; set; }
public Item2 Item2 { get; set; }
}
public class InputModelValidator
: AbstractValidator<InputModel>
{
public InputModelValidator()
{
RuleFor(request => request.Item2)
.NotNull()
.When(request =>
request.Item != null
&& !string.IsNullOrEmpty(request.Item.Code)
&& request.Item.Code == "yes")
.WithMessage("Item2 is mandatory if Item.code == 'yes'");
}
}
尽管如此,仍有许多不同的方法,但我在我的项目中使用了 FluentValidation。
,首先,在 Item2
类中,删除 [Required]
属性。然后,在 InputModel 中,您可以实现 IValidatableObject,然后验证这些值。代码如下:
public class Item
{
[Required]
public string Id { get; set; }
[Required]
public string desc { get; set; }
[Required]
public string code { get; set; }
}
public class Item2
{
public string Id { get; set; }
public string slug { get; set; }
}
public class InputModel: IValidatableObject
{
[Required]
[EmailAddress]
[Display(Name = "Email")]
public string Email { get; set; }
[Required]
[StringLength(100,ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.",MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm password")]
[Compare("Password",ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
[Required]
public Item Item { get; set; }
public Item2 Item2 { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (Item.code.ToLower() == "yes")
{
if(Item2.Id==null)
yield return new ValidationResult($"Item2 ID is required!",new[] { "Item2.Id" });
if (Item2.slug == null)
yield return new ValidationResult($"Item2 slug is required!",new[] { "Item2.slug" });
}
}
}
截图如下:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。