我可以跳过 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' 规则。
我正在创建一个基于 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' 规则。