@Html.EditorForを使用してフォームを生成する人物モデルの可変長リストがあります。
public class Person
{
public string First { get; set; }
public string Last { get; set; }
}
同じ姓名を持つ人物オブジェクトがないことを検証するための最良の方法は何でしょうか。
@Html.EditorForを使用してフォームを生成する人物モデルの可変長リストがあります。
public class Person
{
public string First { get; set; }
public string Last { get; set; }
}
同じ姓名を持つ人物オブジェクトがないことを検証するための最良の方法は何でしょうか。
以下は、コレクション内の2つのアイテムが同じでないことを検証するための最小限の実装です。Person
public class NoDuplicatePersonsAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
var people = value as IList<Person>;
int count = people.Count();
if (people == null) return true;
for (int x = 0; x < count; x++)
{
for (int y = 0; y < count; y++)
{
if (x != y &&
people[x].FirstName == people[y].FirstName &&
people[x].LastName == people[y].LastName)
return false;
}
}
return true;
}
}
public class IndexViewModel
{
[NoDuplicatePersons]
public IList<Person> People { get; set; }
}
public class Person
{
public string FirstName{ get; set; }
public string LastName { get; set; }
}
テーブルに一意の制約を作成し、可能であればPerson挿入でDB例外をインターセプトします。
ただし、検証属性を作成して、既存の名前と名前の組み合わせを確認することもできます。
この擬似コードの例では、名と名前の組み合わせのチェックは考慮されていませんが、質問ごとのカスタム検証の例として、1つのフィールドNAMEのみが確認されています。
カスタム検証属性を作成します。
public class NameAttribute : ValidationAttribute, IClientValidatable
{
//Validate logic
}
モデルでは、カスタム検証属性を使用し、エラーメッセージを含めます。
public class Person
{
[Required]
[Name (ErrorMessage = "This name already exists.")]
[Display(Name = "Name")]
public string Name { get; set; }
}
意見:
<div class="editor-field">
@Html.TextBoxFor(m => m.Name)
@Html.ValidationMessageFor(m => m. Name)
</div>