Asp.net mvc ASP:NET MVC字段摘要作为字段本身的验证(递归性)
我在模型中有以下类:Asp.net mvc ASP:NET MVC字段摘要作为字段本身的验证(递归性),asp.net-mvc,Asp.net Mvc,我在模型中有以下类: public partial class OrganizationUnit { public string code{ get; set; } public int OrganizationCod { get; set; } public string name { get; set; } public string ParentUnitCode{ get; set; } public int level{ get; set; }
public partial class OrganizationUnit
{
public string code{ get; set; }
public int OrganizationCod { get; set; }
public string name { get; set; }
public string ParentUnitCode{ get; set; }
public int level{ get; set; }
public string author{ get; set; }
public System.DateTime CreateDtStmp{ get; set; }
public int Status { get; set; }
public decimal weighing { get; set; }
[ForeignKey("status")]
public virtual Status UnitStatus { get; set; }
public virtual Organization Organization { get; set; }
public virtual ICollection<OrganizationUnit> OrganizationUnit1{ get; set; }
[ForeignKey("ParentUnitCode")]
public virtual OrganizationUnit OrganizationUnit2{ get; set; }
public OrganizationUnit ()
{
CreateDtStmp= DateTime.Now;
author = HttpContext.Current.User.Identity.Name.Substring(4,HttpContext.Current.User.Identity.Name.Length - 4);
}
}
如果
OrganizationUnit1
是具有相同ParentUnit
的所有其他单元的集合,则可以通过实现IValidatableObject
在ViewModel中执行检查:
using System.ComponentModel.DataAnnotations;
public partial class OrganizationUnit : IValidatableObject {
/* properties etc... */
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
if (OrganizationUnit1.Sum(o => o.weighing) + this.weighing > 100.0) {
yield return new ValidationResult(
"Sum of weightings would exceed 100.",
new[] { "weighing" });
}
}
}
使用System.ComponentModel.DataAnnotations;
公共部分类组织单元:IValidatableObject{
/*属性等*/
公共IEnumerable验证(ValidationContext ValidationContext){
if(OrganizationUnit1.Sum(o=>o.weighting)+this.weighting>100.0){
返回新的ValidationResult(
“权重之和将超过100。”,
新[]{“称重”});
}
}
}
请注意,这假设称重
是针对OrganizationUnit1
集合中的所有单元发回的(例如,作为隐藏字段),因此当MVC管道执行此检查时(这是在点击POST操作之前完成的),可以访问该字段
如果此检查失败,控制器中的ModelState.IsValid
将为false
如果您无法访问Viewmodel中的其他单元,则必须从控制器中的DB中获取它们并在那里执行检查。经过一段时间的尝试,我想出了一个完美的解决方案,但我不确定这是最佳做法。这是在控制器类上
public ActionResult Create(OrganizationUnit organizationunit)
{
decimal weighingsum= 0;
foreach (var val in db.OrganizationUnit.Where(t => t.ParentUnitCode== organizationunit.ParentUnitCode))
{
weighingsum+= val.weighing ;
}
weighingsum+= organizationunit.weighing ;
if (weighingsum > 100)
{
ModelState.AddModelError("", "Weighing sum can not exceed 100 for a Parent Unit");
}
else
{
if (ModelState.IsValid)
{
db.OrganizationUnit.Add(organizationunit);
db.SaveChanges();
return RedirectToAction("Index");
}
}
return View(organizationunit);
}
如果有人提出更好的解决方案,请与我们分享,我将不胜感激。向我们展示包含称重验证的插入记录操作的控制器代码,特别是在使用实体框架的情况下。对于延迟,我已更新问题,包括@TetsuyaYamamoto引用的内容。这是我的第一个MVC ASP.NET应用程序,所以不习惯这种方法和实体框架。我知道ASP.NET.NET是具有相同父单元的所有其他单元的集合?或者您必须从数据库中获取它们吗?在ParentUnitCode与代码相关的表本身中存在递归性。现在集合(OrganizationUnit1)由VS和OrganizationUnit2自动生成。我在上面添加了注释,以便前面提到的递归可以在视图中工作。然后我们小时候就开始研发,体重35。另一个孩子也有35磅重。假设这些已经被保存。现在,我们正在引入一个新的,称为“支持”,我们正试图用一个35磅的重量来拯救它。无论是在post之后还是之前,控制器都应该警告用户并阻止模型保存。所有子项(包括新的子项)的ParentUnitCode=3。
public ActionResult Create(OrganizationUnit organizationunit)
{
decimal weighingsum= 0;
foreach (var val in db.OrganizationUnit.Where(t => t.ParentUnitCode== organizationunit.ParentUnitCode))
{
weighingsum+= val.weighing ;
}
weighingsum+= organizationunit.weighing ;
if (weighingsum > 100)
{
ModelState.AddModelError("", "Weighing sum can not exceed 100 for a Parent Unit");
}
else
{
if (ModelState.IsValid)
{
db.OrganizationUnit.Add(organizationunit);
db.SaveChanges();
return RedirectToAction("Index");
}
}
return View(organizationunit);
}