я работаю над веб-приложением asp.net mvc-5 с сущностью framework-6. и я сопоставил свои таблицы БД, используя структуру сущности, которая генерирует файл .edmx, содержащий класс DBContext. и в настоящее время у меня есть два класса контроллеров: один для управления серверами, а другой для управления vms. Когда я добавляю/редактирую сервер или виртуальные машины, я хочу проверить, существуют ли уже их IP- и mac-адреса. в настоящее время я провожу эти проверки самого метода действия следующим образом: -
public class Server : Controller{
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(ServerJoin sj)
{
bool ITipunique = repository.ISITIPUnique(vmj.NetworkInfo2.FirstOrDefault().IPADDRESS);
bool ITmacunique = repository.ISITMACUnique(vmj.NetworkInfo2.FirstOrDefault().MACADDRESS);
bool Tipunique = repository.ISTIPUnique(vmj.NetworkInfo2.FirstOrDefault().IPADDRESS);
bool Tmacunique = repository.ISTMACUnique(vmj.NetworkInfo2.FirstOrDefault().MACADDRESS);
try
{
if ((sj.IsIPUnique == true) && (!ITipunique || !Tipunique))
{
ModelState.AddModelError("NetworkInfo2[0].IPAddress", "Error occurred. The Same IP is already assigned.");
}
if ((sj.IsMACUnique == true) && (!ITmacunique || !Tmacunique))
{
ModelState.AddModelError("NetworkInfo2[0].MACAddress", "Error occurred. The Same MAC Address is already assigned.");
}
&
public class VM : Controlelr {
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(VMJoin vmj)
{
bool ITipunique = repository.ISITIPUnique(vmj.NetworkInfo2.FirstOrDefault().IPADDRESS);
bool ITmacunique = repository.ISITMACUnique(vmj.NetworkInfo2.FirstOrDefault().MACADDRESS);
bool Tipunique = repository.ISTIPUnique(vmj.NetworkInfo2.FirstOrDefault().IPADDRESS);
bool Tmacunique = repository.ISTMACUnique(vmj.NetworkInfo2.FirstOrDefault().MACADDRESS);
try
{
if ((vmj.IsIPUnique == true) && (!ITipunique || !Tipunique))
{
ModelState.AddModelError("NetworkInfo2[0].IPAddress", "Error occurred. The Same IP is already assigned.");
}
if ((vmj.IsMACUnique == true) && (!ITmacunique || !Tmacunique))
{
ModelState.AddModelError("NetworkInfo2[0].MACAddress", "Error occurred. The Same MAC Address is already assigned.");
}
if (!repository.IshypervisorServers(vmj.VirtualMachine.ServerID))
{
ModelState.AddModelError("VirtualMachine.ServerID", "Error occurred. Please select a valid hypervisor server. ");
}
этот подход работает хорошо, но я столкнулся с проблемой, что мне нужно повторить эти проверки для всех связанных методов действий в основном (добавить и изменить) и внутри других классов контроллера (сервер, vms, устройство хранения и т. д...) так есть ли способ лучше управлять общей проверкой, что облегчает повторное использование и ремонтопригодность?
ИЗМЕНИТЬ
ServerJoin выглядит следующим образом: -
public class ServerJoin : IValidatableObject
{
public Server Server { get; set; }
public Resource Resource { get; set; }
public Technology Technology { get; set; }
public SDOrganization Site { get; set; }
public SDOrganization Customer { get; set; }
public NetworkInfo NetworkInfo { get; set; }
public ICollection<NetworkInfo> NetworkInfo2 { get; set; }
[Display(Name="Unique")]
public bool IsMACUnique { get; set; }
[Display(Name = "Unique")]
public bool IsIPUnique { get; set; }
public Nullable<double> SPEED { get; set; }
public Nullable<Int64> PROCESSORCOUNT { get; set; }
[Display(Name = "IP Unique")]
public bool IsTIPUnique { get; set; }
[Display(Name = "MAC Unique")]
public bool IsTMACUnique { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (Server != null)
{
if (Server.RackUnitID != null && Server.RackID == null)
{
yield return new ValidationResult("Please select a Rack, or remove the current Rack Unit", new[] { "Server.RackUnitID" });
}
if (Server.RackUnitIDTo != null && Server.RackUnitID == null)
{
yield return new ValidationResult("Please select a Rack From Value", new[] { "Server.RackUnitID" });
}
if (Server.RackUnitIDTo != null && Server.RackUnitID != null && Server.RackUnitID > Server.RackUnitIDTo)
{
yield return new ValidationResult("Rack Unit From must be less than or equal Rack Unit To", new[] { "Server.RackUnitID" });
}
}
&
public class VMJoin
{
public VirtualMachine VirtualMachine { get; set; }
public Resource Resource { get; set; }
public Technology Technology { get; set; }
public SDOrganization Site { get; set; }
public SDOrganization Customer { get; set; }
public NetworkInfo NetworkInfo { get; set; }
public ICollection<NetworkInfo> NetworkInfo2 { get; set; }
public ICollection<TechnologyIP> TechnologyIP { get; set; }
[Display(Name = "Unique")]
public bool IsMACUnique { get; set; }
[Display(Name = "Unique")]
public bool IsIPUnique { get; set; }
public Nullable<double> SPEED { get; set; }
public TechnologyIP TechnologyIP2 { get; set; }
[Display(Name = "IP Unique")]
public bool IsTIPUnique { get; set; }
[Display(Name = "MAC Unique")]
public bool IsTMACUnique { get; set; }
}
}
Controller
, чтобы добавить дополнительный метод (и вы также можете включить защищенное свойство или поле для репозитория, чтобы к нему можно было получить доступ во всех производных от него контроллерах). Нет никакой разницы с использованием стандартного классаController
— вы просто получаете все свои контроллеры, которым нужен доступ к общему методу, изBaseController
, а не изController
. 20.04.2016