检查" ModelState.IsValid"仅在模型的某些部分

时间:2018-06-18 09:17:57

标签: c# asp.net-mvc asp.net-core-mvc

我使用的是ASP.NET-MVC Core 2.1,我的代码中有ViewModel

    public class HomeViewModel
    {
        public HomeViewModel()
        {
            Section1 = new HomeSection1ViewModel();
            Section2 = new HomeSection2ViewModel();
        }

        public HomeSection1ViewModel Section1 { get; set; }
        public HomeSection2ViewModel Section2 { get; set; }
    }

    public class HomeSection1ViewModel
    {
        public Guid ID { get; set; }
        [Required(ErrorMessage = "Required")]
        public string Title { get; set; }
        [Required(ErrorMessage = "Required")]
        public string Description { get; set; }
        [Required(ErrorMessage = "Required")]
        public string Link { get; set; }
    }

    public class HomeSection2ViewModel
    {
        public HomeSection2ViewModel()
        {
            Details = new List<HomeSection2DetailViewModel>();
        }

        public Guid ID { get; set; }
        [Required(ErrorMessage = "Required")]
        public string Title { get; set; }
        [Required(ErrorMessage = "Required")]
        public string Header { get; set; }
        public List<HomeSection2DetailViewModel> Details { get; set; }
    }

    public class HomeSection2DetailViewModel
    {
        public Guid ID { get; set; }
        [Required(ErrorMessage = "Required")]
        public string Title { get; set; }
        public string Description { get; set; }
        public string Link { get; set; }
        [Required(ErrorMessage = "Required")]
        [Range(0, int.MaxValue, ErrorMessage = "Please enter a valid number")]
        public int? Sequence { get; set; }
        public DatabaseAction Action { get; set; }
    }  

我的视图页面将HomeViewModel绑定为Model,我的问题是如何仅验证Model的某些部分?例如,我想在我的Controller中验证Section2但不验证Section1。我如何实现这一目标?

任何回复都将不胜感激。

3 个答案:

答案 0 :(得分:0)

这可以通过客户端身份验证而不是服务器端来实现 否则你可以覆盖你的模型。

public class BaseModel
{
   [Required]
   public string RequiredProperty { get; set; }
}


public class DerivativeModel : BaseModel
{
    new public string RequiredProperty { get; set; }
}

享受;)

答案 1 :(得分:0)

看起来您将HomeViewModel绑定到不同的视图,在某些视图中,您要验证所提到的某些属性。

有多种方法可以完成这项工作,这里有2个我能想到的:

1-在ViewModel中实现IValidatableObject

public class HomeSection2ViewModel : : IValidatableObject
{
    public HomeSection2ViewModel()
    {
        Details = new List<HomeSection2DetailViewModel>();
    }

    public Guid ID { get; set; }

    public string Title { get; set; }

    public string Header { get; set; }
    public bool Validate { get; set; }
    public List<HomeSection2DetailViewModel> Details { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
      if(Validate)
      {
          if(string.IsNullOrEmpty(Title)
          {
               yield return
                    new ValidationResult(errorMessage: "required",
                        memberNames: new[] { "Title" });
          }
      }
    }
}

2-或将每个View绑定到具有所需验证的ViewModel版本,并使用 AutoMapper 将Model映射到ViewModel或ViewModel映射到另一个ViewModel。

答案 2 :(得分:0)

您的HomeViewModel有一个构造函数,用于初始化HomeSection1ViewModelHomeSection2ViewModel属性。 DefaultModelBinder在POST方法中初始化HomeViewModel的实例并调用其构造函数,这意味着Section1Section2属性都已初始化,但因为您只是为只有一个,另一个因为应用于其属性的验证属性而无效。

HomeViewModel中删除构造函数,以便Section2仅初始化DefaultModelBinder(基于请求中的值)。默认情况下,Section1将为null,因此不对其任何属性执行验证。