2017-02-07 7 views
0

I持っているモデルで、次のクラス:私はサムを検証する必要が新しいレコードを挿入する前に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 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); 
    } 
} 

(計量)同じParentUnitを持つレコードのみを考慮して、試行された新しいレコードを含めて100を超えることはできません。

これはモデルで実行できますか、コントローラで実行する必要がありますか?

この

が保存コントローラ部(基本的にはVSによって自動生成されたものである)である、ビューがメソッドに対応するパラメータを送信することを検討してください。

private SAIM_IPM_DVContext db = new SAIM_IPM_DVContext(); 
[HttpPost] 
[ValidateAntiForgeryToken]   
public ActionResult Create(OrganizationUnit organizationunit) 
{ 
    if (ModelState.IsValid) 
    { 
     db.OrganizationUnit.Add(organizationunit); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    return View(organizationunit); 
} 
+1

特に、Entity Frameworkが使用されている場合は、計量の検証が含まれるレコードの挿入操作のコントローラコードを表示してください。 –

+0

遅れて申し訳ありませんが、私は哲也山本が何を言及したのかなどの質問を更新しています。これは私の最初のMVC ASP.NETアプリケーションではないので、この方法論とエンティティフレームワークには慣れていません。私はASP.NETを知っている。 –

+0

'OrganizationUnit1'は、同じ' ParentUnit'を持つ他のすべてのユニットのコレクションですか?またはDBからそれらを取得する必要がありますか? –

答えて

0

OrganizationUnit1場合は、すべての他のユニットとの集まりです同じParentUnit、あなたはIValidatableObjectを実装することにより、ViewModelににチェックを実行することができます。これはweighingは、内のすべてのユニットのために戻って掲載されていることを前提としていること

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

注意をコレクションOrganizationUnit1このチェックがMVCパイプラインで実行されるとアクセス可能になります(これはPOSTアクションがヒットする前に行われます)。

このチェックに失敗した場合は、コントローラでModelState.IsValidがfalseになります。

Viewmodelの他のユニットにアクセスできない場合は、コントローラのDBからそれらのユニットを取り出してそこでチェックを実行する必要があります。

0

しばらくすると、私はこのソリューションが完璧に機能すると思いましたが、ベストプラクティスはわかりません。これはコントローラクラスにあります

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

誰かがより良い解決策を提示する必要がありますか、私はそれを感謝します。

関連する問題