1

現在の asp.net サイトを mvc 3 に移行しています。古い asp.net ページはリピーター コントロールを実装しており、コード ビハインドの各行を検証できます。

Model クラスを作成し、IValidatableObject を継承しています。以下のコードを参照してください。

public class ManageInstitutions : IValidatableObject
{
        public ManageInstitutions() { }

        public int InstitutionID { get; set; }
        public string InstituteName { get; set; }
        public string FName { get; set; }
        public string LName { get; set; }
        public string EAddress { get; set; }

        public IList<InstitutionIPBL> IPDetailsList { get; set; }

        //Validation Function
        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            foreach (var item in IPDetailsList)
            {
                 if (item.IPPart1.Length == 0 && item.IPPart2.Length == 0 && item.IPPart3From.Length == 0 && item.IPPart3To.Length == 0 && item.IPPart4From.Length == 0 && item.IPPart4To.Length == 0)
                  {
                        //How to return ValidationResult that will identify which row got an error????????? 
                  }
            }
        }


}

これInstitutionIPBLは、古い asp.net ビジネス レイヤーから派生したクラスです。このクラスを再利用して、モデルのプロパティとして表します。

エラーが発生した行を特定する方法を知る必要があります。この構文を使用して、フィールドが有効かどうかを確認しています。Html.ViewData.ModelState.IsValidField("[Field Name]"))

私の問題は、上記のコードの図解されたコメントに従って、エラーが発生した行を特定する方法です。

誰?お知らせ下さい。前もって感謝します

4

1 に答える 1

0

配列とコレクションの検証は、サポートが不足しているため、MVC では扱いにくいものです。

IEnumerable、ICollection、IList など内の単一の要素を検証する場合、HTML 要素内の各要素のインデックスと ModelState 内の検証インデックスを含める必要があります (少なくとも、カスタム モデルを作成する必要がない最も一般的な回避策として)。バインダー)。

したがって、モデルが次のようになっている場合:

public IList<string> List { get; set; } 

マークアップは次のようになります。

<input type="text" name="List[0]" />
<input type="text" name="List[1]" />
<input type="text" name="List[2]" />

次に、各要素には独自のインデックスがあることがわかります。これは、MVC のフォーム プロバイダーが入力をモデルにバインドするために使用するものです。

したがって、検証を作成するときは、違反している要素のインデックスを含める必要があります (簡単にするためにコードを展開しています)。

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
        for (int i = 0; i < List.Count; i++) {
            if (string.IsNullOrEmpty(List[i])) {
                yield return new ValidationResult(i + 
                                  ": You forgot to fill in the box.",
                                  new[] { "List[" + i + "]" });
            }  
        }
}

次に、検証メッセージを書き出すときに:

@Html.ValidationMessage("List[1]")

どの要素に検証メッセージがあるかを実際に調べる限り、ModelState を調べて無効な要素のキーを取得する必要があります。

ModelState.Where(x => x.Key.StartsWith("List") && x.Value.Errors.Count > 0)
          .Select(x => x.Key);

このようなものは、ModelState にアクセスできる HtmlHelper にすることができます。

public static IEnumerable<string> 
      GetValidationMessagesForGroup(this HtmlHelper helper, string keyStart) {
    return helper.ViewData.ModelState.Where(x => x.Key.StartsWith("List")
                         && x.Value.Errors.Count > 0).Select(x => x.Key);
}

そして、あなたのビューでそれを呼び出します:

@{
   foreach(string key in Html.GetValidationMessagesForGroup("List")) 
       @Html.ValidationMessageFor(key)
}

厳密に型指定されたオブジェクトの場合、それらにキーを設定するために必要なことは、最後にプロパティを追加することだけです。

Child[0].FirstName

リスト内の各要素の各プロパティには、独自のエントリがあることに注意してください。

于 2012-06-14T20:54:11.677 に答える