Я создал специальную аннотацию данных, чтобы выполнить некоторую проверку моей модели представления. Проблема в том, что он не проверяется на стороне клиента. Вот моя модель:
public class MemberViewModel
{
[ScaffoldColumn(false)]
public int MemberId { get; set; }
[Required(ErrorMessage = "Name is required")]
public string Name { get; set; }
//My custom data annotation
[EnforceTrue(ErrorMessage = "You must agree to the Terms and Conditions")]
public bool AgreeTerms { get; set; }
}
Мой код проверки аннотации данных:
public class EnforceTrueAttribute : ValidationAttribute, IClientValidatable
{
public EnforceTrueAttribute() { }
public override bool IsValid(object value)
{
return value != null && (bool)value == true;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRule() { ValidationType = "enforcetrue", ErrorMessage = this.ErrorMessageString };
}
}
Мой метод контроллера:
[HttpPost]
public ActionResult Index(MemberViewModel viewModel)
{
Member member = new Member();
TryUpdateModel(member);
if (ModelState.IsValid)
{
_membersRepository.SaveMember(member);
return RedirectToAction("Index", "Home");
}
return View(viewModel); // validation error, so redisplay same view
}
И мое мнение:
@using (Html.BeginForm("Index", "Members", FormMethod.Post)) {
@Html.HiddenFor(m => m.MemberId)
<div class="editor-label">@Html.LabelFor(model => model.Name)</div>
<div class="editor-field">@Html.TextBoxFor(model => model.Name)</div>
<div class="editor-field">@Html.CheckBoxFor(model => model.AgreeTerms) <label for="AgreeTerms">I agree to the Terms and Conditions</label></div>
<p>
<input type="submit" value="Submit" />
</p>
@Html.ValidationSummary()
}
Таким образом, все мои другие сообщения об ошибках отображаются в сводке проверки с проверкой на стороне клиента. Но для моей аннотации пользовательских данных сообщение об ошибке не отображается до тех пор, пока остальная часть модели не станет действительной, и после того, как вы отправите форму и перезагрузите страницу, именно тогда ошибка отображается в сводке.
Есть ли что-то еще Мне нужно сделать здесь, чтобы он отображался в сводке с другими ошибками?
Я использую C # и ASP.NET MVC 3