joh*_* Gu 4 c# asp.net asp.net-mvc asp.net-mvc-5
我正在使用实体框架-6在asp.net mvc-5 Web应用程序上工作.我使用实体框架映射了我的数据库表,生成包含DBContext类的.edmx文件.目前我有两个控制器类,一个用于管理服务器,另一个用于管理vms.添加/编辑服务器或VM时,我想检查他们的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.");
}
Run Code Online (Sandbox Code Playgroud)
&
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. ");
}
Run Code Online (Sandbox Code Playgroud)
这种方法运行良好,但我面临的一个问题是,我必须在所有相关的操作方法上重复这些验证(主要是添加和编辑)和其他控制器类(服务器,虚拟机,存储设备等)...那么有没有办法以更好的方式管理共享验证,这有助于重用和可维护性?
编辑
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" });
}
}
Run Code Online (Sandbox Code Playgroud)
&
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; }
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
首先为模型创建一个具有公共属性的基类,这也将减少具体类中的代码.
public class BaseModel
{
public bool IsIPUnique { get; set; }
public bool IsMACUnique { get; set; }
.... // other common properties
}
public class ServerJoin : BaseModel
{
.... // properties specific to ServerJoin
}
public class VMJoin : BaseModel
{
.... // properties specific to VMJoin
}
Run Code Online (Sandbox Code Playgroud)
并为通用验证代码创建一个基本控制器
public class BaseController : Controller
{
public void Validate(BaseModel model)
{
bool ITipunique = repository.ISITIPUnique(vmj.NetworkInfo2.FirstOrDefault().IPADDRESS);
....
if ((model.IsIPUnique == true) && (!ITipunique || !Tipunique))
{
ModelState.AddModelError("NetworkInfo2[0].IPAddress", "Error occurred. The Same IP is already assigned.");
}
if ((model.IsMACUnique == true) && (!ITmacunique || !Tmacunique))
{
ModelState.AddModelError("NetworkInfo2[0].MACAddress", "Error occurred. The Same MAC Address is already assigned.");
}
.... // other common validation
}
}
Run Code Online (Sandbox Code Playgroud)
然后在特定的控制器上
public class ServerController : BaseController
{
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(ServerJoin sj)
{
Validate(sj); // adds the ModelStateErrors
if (!ModelState.IsValid)
{
return View(sj);
}
....
}
}
public class VMController : BaseController
{
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(VMJoin vmj)
{
Validate(vmj); // adds the ModelStateErrors
if (!ModelState.IsValid)
{
return View(vmj);
}
....
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
288 次 |
| 最近记录: |