我使用的是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
。我如何实现这一目标?
任何回复都将不胜感激。
答案 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
有一个构造函数,用于初始化HomeSection1ViewModel
和HomeSection2ViewModel
属性。 DefaultModelBinder
在POST方法中初始化HomeViewModel
的实例并调用其构造函数,这意味着Section1
和Section2
属性都已初始化,但因为您只是为只有一个,另一个因为应用于其属性的验证属性而无效。
从HomeViewModel
中删除构造函数,以便Section2
仅初始化DefaultModelBinder
(基于请求中的值)。默认情况下,Section1
将为null
,因此不对其任何属性执行验证。