我可以跳过 aspmvc 5 (C#) 中 ModelState.IsValid() 验证的属性/字段吗?或为隐藏字段分配一个值?

Can I skip an attribute / field to be validated by ModelState.IsValid() in asp mvc 5 (C#)? or Assign a value to Hidden Field?

我正在创建一个基于 ASP.Net MVC 5 (C#) 的 Web 应用程序,并停留在特定类型的验证上。基本上,我有 5 个模型,我将其对象包含在视图模型中。这五个模型之一作为列表包含在视图模型中。由于这些模型之间存在关系,因此实现了外键,并且我已将外键注释为 Required 因为它们必须存在。

场景 型号 Classes: 客户端 - 应用程序中的客户端 AddressOf - 财产和客户的地址 ClientPhone - 客户的电话 - 具有客户的外键 ClientEmail - 客户的电子邮件 - 具有客户的外键 顾问 - 在管理系统中处理客户的顾问

现在,我在 View.cshtml 中有客户对象、地址对象、客户电话、客户电子邮件和顾问下拉列表的字段。不包括 ClientPhone.ClientCNIC 和 ClientEmail.ClientCNIC 的字段,它们是外键,当我在客户端 Table 中输入数据时将在控制器中输入。 ClientCNIC 在 View.cshtml 中确实有字段,但它来自客户端 Table。由于ClientPhone和ClientEmail中的ClientCNIC字段(Foreign Key)注解为[Required],显示验证错误。

我想要的是,将为Client.ClientCNIC创建的字段的值分配给属性ClientPhone.ClientCNIC和ClientEmail.ClientCNIC。

提前致谢!

控制器

[HttpPost]
        public ActionResult Save(ClientFormViewModel clientFormViewModel)
        {
            if (ModelState.IsValid)
            {
                ViewBag.error = "";

                var Client = clientFormViewModel.Client;
                var Email = clientFormViewModel.ClientEmail;
                var Address = clientFormViewModel.AddressOf;
                var phone = clientFormViewModel.ClientPhone;

                _context.addressof.Add(Address);
                _context.SaveChanges();
                Client.addressofId = _context.addressof.Select(e => e.addressofId).Max();
                _context.Clients.Add(Client);
                try
                {
                    _context.SaveChanges();
                }
                catch (DbUpdateException)
                {
                    _context.addressof.Remove(Client.AddressOf);
                    _context.SaveChanges();
                    ViewBag.Duplicate = "Duplicate Client";
                    clientFormViewModel.Consultants = _context.Consultants.ToList();
                    return View("ClientForm", clientFormViewModel);
                }

                phone.ClientCNIC = Client.ClientCNIC;
                phone.PrimaryPhone = true;
                _context.ClientPhone.Add(phone);

                Email.ClientCNIC = Client.ClientCNIC;
                Email.PrimaryEmail = true;
                _context.clientemail.Add(Email);

                _context.SaveChanges();

                return Content("Successful!");
            }

            ViewBag.error = "Has Error";
            clientFormViewModel.Consultants = _context.Consultants.ToList();
            return View("ClientForm", clientFormViewModel);
        }


        public ActionResult New()
        {
            ViewBag.Type = "New Client";

            var address = new AddressOf();
            var client = new Client();
            var phone = new ClientPhone();
            var email = new ClientEmail();


            var viewModel = new ClientFormViewModel()
            {
                Client = client,
                ClientPhone = phone,
                ClientEmail = email,
                AddressOf = address,
                Consultants = _context.Consultants.ToList()
            };

            viewModel.ClientEmail.ClientCNIC = viewModel.Client.ClientCNIC;
            viewModel.ClientPhone.ClientCNIC = viewModel.Client.ClientCNIC;


            return View("ClientForm", viewModel);
        }

ClientPhone - 型号 Class - 与 ClientEmail

的结构相同
namespace ITCMS4
{
    using System;
    using System.Collections.Generic;

    [Table("ClientPhones")]
    public partial class ClientPhone
    {
        [Key] public int ClientPhoneId { get; set; }
        [Required] public string Phone { get; set; }
        [Required] public bool PrimaryPhone { get; set; }
        [Display(Name = "Client"), ForeignKey("Client")] public string ClientCNIC { get; set; }
        public virtual Client Client { get; set; }
    }
}

一种方法是从 'offending' 属性中删除 [Required] 属性,同时确保在需要时为它们分配正确的值。 ViewModel 并不总是必须通过数据注释属性强制或模仿所有数据模型规则,这是一个很好的例子。

另一种方法是保留 ClientFormViewModel class 的属性和 create a custom ModelBinder,然后应用您的 'assign this also to that' 规则。