Asp.net 如何根据条件要求填充实体属性-ASP NET核心MVC和实体框架
仅当Asp.net 如何根据条件要求填充实体属性-ASP NET核心MVC和实体框架,asp.net,asp.net-mvc,asp.net-core,Asp.net,Asp.net Mvc,Asp.net Core,仅当Item.code=“是”时,我才希望Item2为必填项。InputModel在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 Item
Item.code
=“是”时,我才希望Item2
为必填项。InputModel
在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; }
}
我打算在InputModel中做类似的事情
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (Item.code=="yes")
{
===> set Item2 Required
}
}
公共IEnumerable验证(ValidationContext ValidationContext)
{
如果(项目代码=“是”)
{
=>需要设置项目2
}
}
这就是逻辑,有人能帮忙吗?我建议你试试,这在评论中提到过。花点时间来研究它确实是值得的。让我们想象一下,您已经下载了它,并且想要实现您的验证
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'");
}
}
公共类输入模型
{
公共字符串电子邮件{get;set;}
公共字符串密码{get;set;}
公共项项{get;set;}
公共项2项2{get;set;}
}
公共类InputModelValidator
:抽象验证器
{
公共InputModelValidator()
{
RuleFor(请求=>request.Item2)
.NotNull()
.When(请求=>
request.Item!=null
&&!string.IsNullOrEmpty(request.Item.Code)
&&request.Item.Code==“是”)
.WithMessage(“如果Item.code=='yes',则Item2为必填项”);
}
}
尽管有很多不同的方法,但是我在我的项目中使用了FluentValidation。首先,在
Item2
类中,删除[必需的]
属性。然后,在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" });
}
}
}
公共类项目
{
[必需]
公共字符串Id{get;set;}
[必需]
公共字符串desc{get;set;}
[必需]
公共字符串代码{get;set;}
}
公共类项目2
{
公共字符串Id{get;set;}
公共字符串slug{get;set;}
}
公共类InputModel:IValidatableObject
{
[必需]
[电邮地址]
[显示(Name=“电子邮件”)]
公共字符串电子邮件{get;set;}
[必需]
[StringLength(100,ErrorMessage={0}必须至少为{2}个字符,最大长度为{1}个字符。”,最小长度=6)]
[数据类型(数据类型.密码)]
[显示(Name=“密码”)]
公共字符串密码{get;set;}
[数据类型(数据类型.密码)]
[显示(Name=“确认密码”)]
[比较(“密码”,ErrorMessage=“密码和确认密码不匹配。”)]
公共字符串ConfirmPassword{get;set;}
[必需]
公共项项{get;set;}
公共项2项2{get;set;}
公共IEnumerable验证(ValidationContext ValidationContext)
{
如果(Item.code.ToLower()=“是”)
{
if(Item2.Id==null)
返回新的ValidationResult($“需要Item2 ID!”,新[]{“Item2.ID”});
if(Item2.slug==null)
返回新的ValidationResult($“需要Item2 slug!”,新[]{“Item2.slug”});
}
}
}
屏幕截图如下:
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" });
}
}
}
回答其他问题可能会对您有所帮助。请提供更多详细信息。您现在有什么样的验证?您是否使用其他工具,例如FluentValidation?否。我只使用带有mvc和实体框架的asp net core。我正在更改注册页面。我打算应用这个规则。有人有什么建议吗?我没有注意到你写过你不打算使用任何额外的软件包。是的,这意味着我的答案不是正确的。