Я заметил, что при создании пользовательского атрибута проверки моя проверка запускается только после срабатывания собственных аннотаций данных MVC. Есть ли способ, которым он мог выстрелить "одновременно"?
Чтобы показать, что я имею в виду, представьте, что у меня есть эта форма:
FirstName: <FirstName Textbox>
LastName: <LastName TextBox>
Zip: <Zip TextBox>
Итак, у меня есть аннотация [Требуется] для всех 3, но кроме того, для свойства Zip у меня есть пользовательский атрибут. Если пользователь НЕ вводит имя или фамилию, но вводит недопустимый Zip (который должен подтверждать мой атрибут), на всех трех должно быть сообщение об ошибке, но это не так. Там только ошибка на firstName и lastName.
Это код:
Person.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
// My validator
using MvcApplication3.Extensions.Validation;
namespace MvcApplication3.Models
{
public class Person
{
[Required(ErrorMessage="Field required!")]
public string firstName{get;set;}
[Required(ErrorMessage="Field required!")]
public string lastName { get; set; }
[Zip(ErrorMessage="You gotta put in a valid zip code")]
[Required(ErrorMessage="Field required!")]
public string zipCode { get; set; }
}
}
Контроллер:
[HttpPost]
public ActionResult Index(FormCollection form, Person person)
{
return View(person);
}
Вид:
@model MvcApplication3.Models.Person
@{
ViewBag.Title = "Person";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<h2>
Testing Form: @Model.firstName
</h2>
<hr />
@{Html.EnableClientValidation();}
@using (Html.BeginForm())
{
@Html.LabelFor(model => model.firstName)
@Html.TextBoxFor(model => model.firstName)
@Html.ValidationMessageFor(model=>model.firstName)
<br /><br />
@Html.LabelFor(model => model.lastName)
@Html.TextBoxFor(model => model.lastName)
@Html.ValidationMessageFor(model=>model.lastName)
<br /><br />
@Html.LabelFor(model => model.zipCode)
@Html.TextBoxFor(model => model.zipCode)
@Html.ValidationMessageFor(model=>model.zipCode)
<br /><br />
<input type="submit" value="Submit" />
}
Zip Validator (Zip.cs):
public class ZipAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
bool foundMatch = false;
try
{
foundMatch = Regex.IsMatch(value.ToString(), "\\A\\b[0-9]{5}(?:-[0-9]{4})?\\b\\z");
}
catch (ArgumentException ex)
{
// Syntax error in the regular expression
}
return foundMatch;
}
}
Кроме того, я знаю, что могу сделать это с помощью аннотации данных Regexp, но я собираюсь развернуть свои собственные валидаторы в будущем.
Спасибо!