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);
    }