:
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
public static class ModelHelper
{
public static void ValidateModel(
this Controller controller,
object viewModel)
{
controller.ModelState.Clear();
var validationContext = new ValidationContext(viewModel, null, null);
var validationResults = new List<ValidationResult>();
Validator.TryValidateObject(
viewModel,
validationContext,
validationResults,
true);
foreach (var result in validationResults)
{
foreach (var name in result.MemberNames)
{
controller.ModelState.AddModelError(name, result.ErrorMessage);
}
}
}
}
そして、私はこのユニットテストを実行します:ユニットテストは時にモデルを検証するために、このヘルパーメソッドを使用して
public class CompareTestModel
{
public string Password { get; set; }
[System.Web.Mvc.Compare(
"Password",
ErrorMessage = "The passwords do not match")]
public string PasswordCompare { get; set; }
}
:
私は、この例のモデルを持っています
CompareAttribute
は、ValidationResult
のクラスMemberNames
プロパティには記入されません(source)。したがって、result.MemberNames
は空になります。
MemberNames
プロパティを使用するために必要な(ValidationResult
もこのためconstructorを持っている)ので、あなたはValidationResult
のこの種に対処するためにあなたのValidateModel
ヘルパーを変更する必要はありませんされているので:
foreach (var result in validationResults)
{
if (result.MemberNames.Any())
{
foreach (var name in result.MemberNames)
{
controller.ModelState.AddModelError(name, result.ErrorMessage);
}
}
else
controller.ModelState.AddModelError("", result.ErrorMessage);
}