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。我正在更改注册页面。我打算应用这个规则。有人有什么建议吗?我没有注意到你写过你不打算使用任何额外的软件包。是的,这意味着我的答案不是正确的。