首页 > 解决方案 > 如何检查子模型状态是否有效,而不是检查 asp.net 核心中的主模型状态?

问题描述

模型:这里SubjectDetailsModel包含子模型StudentDetailsModel

    public class SubjectDetailsModel
    {
        [Key]
        public int Id { get; set; }
        [Required]
        public string SubjectName { get; set; }
        [Required]
        public string SubjectCode { get; set; }

        public StudentDetails studentDetails { get; set; }

    }

    public class StudentDetailsModel
    {
        [Key]
        public int Id { get; set; }
        [Required]
        public string Name { get; set; }
        [Required]
        public string EnrollmentNumber { get; set; }
        [Required]
        public string Gender { get; set; }
        [Required]
        public string City { get; set; }

    }

控制器

SubjectDetailsModel当我在 post 方法中作为参数传递时让我知道Index,这次我只需要检查StudentDetailsModel状态是否有效。那么我该怎么做呢?

    public class HomeController : Controller
    {
        [HttpGet]
        public IActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public IActionResult Index(SubjectDetailsModel model)
        {
            //Here i need to check StudentDetails ModelState.Isvalide instead of SubjectDetails model. OR
            //How can the check sub-model state is valid or not instead of checking the main model state?
            if (ModelState.IsValid) // This condition checking SubjectDetailsModel State.
            {
                // Insert recorde
            }
            return View(model);
        }
    }

看法

@model SubjectDetailsModel
<form method="post" asp-action="Index" asp-controller="Home">
    <input asp-for="Id" hidden />
    <input asp-for="SubjectName"/>
    <input asp-for="SubjectCode" />
    <input asp-for="studentDetails.Name"/>
    <input asp-for="studentDetails.Gender" />
    <input asp-for="studentDetails.City" />
    <button type="submit">Submit</button>
</form>

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

解决方案


如果您还需要在邮件模型上放置验证属性,那可能有点棘手。对于您的情况,我建议使用 Fluent Validation NuGet 包,这将有助于在单独的类中编写您的自定义验证代码。

如果看起来像这样:

    public class SubjectDetailsModelValidator : AbstractValidator<SubjectDetailsModel>
    {
        public SubjectDetailsModelValidator()
        {
            RuleFor(x => x.studentDetails.Name).NotEmpty();
            RuleFor(x => x.studentDetails.EnrollmentNumber).NotEmpty();
            RuleFor(x => x.studentDetails.Gender).NotEmpty();
            RuleFor(x => x.studentDetails.City).NotEmpty();
        }
    }

这里是文档,看看:https ://docs.fluentvalidation.net/en/latest/aspnet.html


推荐阅读