Аннотация данных MVC3 для неправильного запуска регулярного выражения

У меня есть POCO Entity Frameworks со свойством, определенным следующим образом:

[RegularExpression(ValidationHelper.RegularExpressionForDateOnly)]
public virtual DateTime LastBuildDate { get; set; }

Где константа определяется следующим образом:

public const String RegularExpressionForDateOnly = 
    @"^(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$";

Я получил это регулярное выражение прямо из OWASP: https://www.owasp.org/index.php/OWASP_Validation_Regex_Repository

Теперь в представлении MVC3 у меня есть:

<tr>
<td class="editor-label">
    @Html.LabelFor(model => model.LastBuildDate)
</td>
<td class="editor-field">
    @Html.EditorFor(model => model.LastBuildDate)
    @Html.ValidationMessageFor(model => model.LastBuildDate)
</td>
</tr>

Когда я пытаюсь указать дату в формате «30.05.2012» или «30.05.2012», она не проходит проверку (на стороне клиента и на стороне сервера). Если я попробую это регулярное выражение вручную, это регулярное выражение ДОЛЖНО разрешать эти форматы. Однако, когда представление MVC3 проверяется с ним, оно не проходит проверку.

По какой другой причине MVC может не пройти эту проверку регулярного выражения?


person Robert Seder    schedule 31.05.2012    source источник


Ответы (2)


Я недостаточно знаю о регулярных выражениях, чтобы точно сказать вам, что вы делаете неправильно, но когда дело доходит до валидаторов MVC3, я определенно рекомендую расширение Data Annotations. вы также можете найти его в Nuget. Он добавляет набор атрибутов проверки, включая проверку даты.

person Jason Kulatunga    schedule 31.05.2012
comment
Во-первых, спасибо - я никогда не сталкивался с этим раньше! Это то, что я могу использовать на стороне сервера (поскольку моя модель находится в другой сборке), но я не могу использовать ни одну из ее частей MVC3, потому что: не иметь громкого имени - person Robert Seder; 31.05.2012
comment
На самом деле - это сделало это, проверка работает / не работает, как и ожидалось, даже без дополнительной части MVC3 (что бы это ни было). Я предполагаю, что в этом регулярном выражении OWASP должно быть что-то глупое? Кто знает. В любом случае, спасибо! - person Robert Seder; 31.05.2012
comment
нет проблем. Я не уверен, что часть MVC3 отсутствует, но я думаю, что есть также ссылка для загрузки версии, отличной от MVC3, которая должна работать без каких-либо ошибок. - person Jason Kulatunga; 31.05.2012

Просто упомянем, что вы можете использовать атрибут RemoteValidation ( http://msdn.microsoft.com/en-us/library/system.web.mvc.remoteattribute(v=vs.98).aspx ), когда вам нужно написать специальный вид проверки , это просто, поскольку вам не нужно создавать собственный адаптер DataAnnotation, а затем регистрировать его в global.asax.

Вот пример:

Ваша модель:

[Remote("ValidateSpecialNumber", HttpMethod="Post", 
    ErrorMessage = "You're number isn't special.")]
public int SpecialNumber { get; set; }

Действие, которое вызывается при проверке:

[HttpPost]
public ActionResult ValidateSpecialNumber(int SpecialNumber)
{
    // validate your number here and return True if validated
    return Json(true);
}

Я указываю на это, потому что об этом мало кто знает.

С Уважением

person Matija Grcic    schedule 31.05.2012
comment
Это круто - раньше я не понимал, как работает этот атрибут, спасибо! - person Robert Seder; 31.05.2012